yaml,json和xml
yaml,json和xml
最近做一个爬虫作业(知乎爬取top50),使用yaml保存数据,数据是一个字典列表,如下:
1 | [ |
用yaml.dump保存时出错:
1 | with open('hot_list.yaml','wb') as f: |
此处提示递归深度超出,如果是常规的深度超出,我们可以手动设置得更深一点:
1 | import sys |
但是此处明显不是python递归的问题,将yaml.dump改为yaml.safe_dump()方法,错误如下:
1 | with open("hot_list.yaml", "w") as f: |
报的是日期对象错误,大概yaml将日期认成是data对象了,两个错误不相干,但大抵能猜到时数据格式的错误。
然后我使用json格式作为保存方式,保存完成,就是上面展示的json文件,代码如下:
1 | with open('hot_list.json','w',encoding='utf-8') as f: |
我们将json文件里的数据读出,并用data_list接收,随后再将data_list写入yaml文件,成功。
1 | with open('hot_list.json','r',encoding='utf-8') as f: |
1 | - comment: 添加评论 |
总结,bug原因是数据的格式不满足yaml的要求,具体是哪里的格式错误呢,仔细找了一圈下来,特殊的格式只有None。
毕竟爬虫能不能爬到数据还是另说,方便后面pandas对数据进行清洗,我对字典的初始化方式为:
1 | data = { |
这就是问题所在了,当爬虫未能爬取到数据时,字典部分值为None,显然yaml不能接受None,导致bug。
但是json能接受这个格式,并在文件里将其保存为null,在存入json文件后数据None转为了null(字符串?),所以也能被yaml操作了。
json
1 | import json |
如果data是str类型
1 | data=data.replace("\'", "\"") |
如果data包含unicode,想要移除unicode编码
1 | data = re.sub(r'\\(?![/u"])', r"\\\\", str(data)) |
如果data包含中文
1 | with open('numbers.json','w',encoding='utf-8') as f: |
dumps返回的是一个字符串,使用f.write(json.dumps(data))
1 | import json |
dump需要一个文件对象作为写入参数,使用json.dump(data, fp=f)
1 | import json |
文件读
1 | with open('numbers.json', 'r') as f: |
yaml
yaml没有dumps和loads写法,使用f.write(yaml.dump(data))
二进制写来写入非str类型数据,encode选择中文编码
1 | import yaml |
一般用法
1 | import yaml |
Object of type datetime is not JSON serializable
,json不支持保存datetime对象,但是可以先保存字符串,文件读取之后再对字符串进行转日期对象操作。
1 | import datetime |
XML
这个格式太丑了,以后有机会再用,到网络编程的时候再学吧。