JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。这种数据在弄爬虫的时候,经常会见到这类型的数据。下面展示一个简单的json数据。
{
"name": "json",
"describe": "是存储和交换文本信息的语法。类似 XML。"
}
#带[]的类型
{
"key": ["a", "b", "sojson.com"]
}
#更复杂一些的类型
{
"title": "python 入门",
"type": "新手入门",
"本篇内容": [
"JSON描述",
"JSON数据读取",
"JSON数据构造",
"CSV",
{
"office": [
"word",
"xls"
]
}
],
"欢迎交流": {
"独学而无友,则孤陋寡闻": "私信"
}
}
很想python的字典格式吧?键:值的对应关系。如果要操作json的模块,那么就需要用到json模块。
Python与JSON相互转换
#python转换为json
import json
data = {
'name' : 'bird',
'color' : 'black',
'weight' : 50
}
json_str = json.dumps(data)
#json转换为python数据
data = json.loads(json_str)
json模块中重要,常用的函数如下:dump - 将Python对象按照JSON格式序列化到文件中。
dumps - 将Python对象处理成JSON格式的字符串。
load - 将文件中的JSON数据反序列化成对象。
loads - 将字符串的内容反序列化成Python对象。
使用的时候请注意其中的差别。比如dumps,指的是将Python对象处理成JSON格式的字符串,而loads指的是将字符串的内容反序列化成Python对象。
注意粗体字部分。dump是将python对象保存到文件中(json格式)。load是读取文件中的json数据返回对象。这两个方法都和文件有关。用法如下:
#python转换为json
import json
data = {
'name' : 'bird',
'color' : 'black',
'weight' : 50
}
#dump()接受2个参数,第一个是接受数据的参数,第二是写入的文件描述。
with open("test.json", "w") as fp:
json.dump(data, fp)
with open(test.json,'r') as fp:
contents = json.load(fp)
print(contents)
csv,xls文件读写
某些小场合,并不需要用到mysql这类型的大型数据库,这时候就需要csv和xls表格应用出场了。CSV (Comma Separated Values) 格式是电子表格和数据库中最常见的输入、输出文件格式。假设一份csv文件内容如下:
#方法原型
csv.reader(csvfile, dialect='excel', **fmtparams)
#例子说明
import csv
with open('test.csv', 'r', newline='', encoding='utf-8') as f:
data =csv.reader(f)
for da in data:
print(da)
#输出如下
['A', 'B', 'C', 'D', 'E', '总结']
['啊', '啊吧', '啊C', '啊d', '啊e', '0.00%']
['啊水电', '的', '0', '0', '3', '0.00%']
['ddd', '0', '0', '0', '3', '0.00%']
csv.reader返回一个reader对象,该对象将逐行遍历f(就是打开的文件描述)。只要支持iterator协议,如果f(csvfile)是文件对象,打开时应该用newline=''。encoding='utf-8',这里主要考虑是如果打开提示编码错误,这里先做一个规避,有时候用了encoding反而提示出错,参考在windows下是cp936编码。
关于分隔符,默认csv是用逗号进行分隔,也可以自己在reader方法中指定,参数是delimiter,直接在参数中提现即可,如:
csv.reader(csvfile, delimiter=';')
更多的参数需要参考python官方文档。
使用csv.writer(csvfile, dialect='excel', **fmtparams),写入内容到test.csv文件中。
#方法原型
csv.writer(*csvfile*, *dialect='excel'*, ***fmtparams*)
#例子说明
import csv
with open('test.csv', 'a+', newline='') as f:
file_input = csv.writer(f)
file_input.writerow(['eee', 'bbb', 'aa', '22%', 'yy', 'sss'])
csv.writer返回一个 writer 对象,该对象负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串。其中默认的分隔符为“,”逗号。这些扩展知识大家可以自行百度,可以在writer的参数中改变默认的分隔符等行为。
writerow()该方法,会将内容以逗号为分隔符,将内容分割放入同一行的每一列中。还有一个writerrows(),这个方法有什么不同的?
#例子说明
import csv
with open('test.csv', 'a+', newline='') as f:
file_input = csv.writer(f)
file_input.writerows([['eee'], ['bbb'], ['aa'], ['22%'], ['yy'], ['sss']])
#输出结果居然是这样,运行后打开test.csv文件,文件内加入了的内容如下
eee
bbb
aa
22%
yy
sss
writerows()将二维列表中的每一个列表写为一行。二维列表是关键,就是这个方法是处理多项数据的。
csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)。创建一个对象,该对象在操作上类似于常规 reader,但是将每行中的信息映射到一个 [dict],该 dict 的键由 fieldnames 可选参数给出。fieldnames参数是一个序列。如果省略 fieldnames,则文件 f 第一行中的值将用作字段名。无论字段名是如何确定的,字典都将保留其原始顺序。
#例子说明
import csv
with open('test.csv', 'r', newline='', encoding='utf-8') as f:
data = csv.DictReader(f)
#print(data)
for da in data:
print(da)
{'A': '啊', 'B': '啊吧', 'C': '啊C', 'D': '啊d', 'E': '啊e', '总结': '0.00%'}
{'A': '啊水电', 'B': '的', 'C': '0', 'D': '0', 'E': '3', '总结': '0.00%'}
{'A': 'ddd', 'B': '0', 'C': '0', 'D': '0', 'E': '3', '总结': '0.00%'}
csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)。与writer类似,创建一个对象,将字典映射到输出行,fieldname是序列,指定了字典中的值的顺序。会按照指定顺序传递给writerrow()写入文件f。
注意,与DictReader 类不同, DictWriter类的 fieldnames参数不是可选参数。
如果字典缺少 fieldnames中的键,则可选参数 restval 用于指定要写入的值。就是说如果要输入的值中缺少了键,则有restval指定值。
如果传递给 writerow()方法的字典的某些键在 fieldnames 中找不到,则可选参数 extrasaction用于指定要执行的操作。 如果将其设置为默认值 'raise',则会引发 [ValueError]。 如果将其设置为 'ignore',则字典中的其他键值将被忽略。
import csv
#直接在test.csv中追加内容。
with open('test.csv', 'a+', newline='') as f:
filednames = ['A', 'B', 'C', 'D', 'E', '总结']
writer = csv.DictWriter(f, fieldnames=filednames, restval='None')
#如果是新建的文件,需要写入表头'A', 'B', 'C', 'D', 'E', '总结',就使用
#writer.writeheader()
writer.writerow({'A': 'Baked', 'B': 'Beans'})
with open('test.csv', 'r', newline='') as f:
reader = csv.DictReader(f)
for read in reader:
#输出
{'A': '啊', 'B': '啊吧', 'C': '啊C', 'D': '啊d', 'E': '啊e', '总结': '0.00%'}
{'A': '啊水电', 'B': '的', 'C': '0', 'D': '0', 'E': '3', '总结': '0.00%'}
{'A': 'ddd', 'B': '0', 'C': '0', 'D': '0', 'E': '3', '总结': '0.00%'}
{'A': 'Baked', 'B': 'Beans', 'C': 'None', 'D': 'None', 'E': 'None', '总结': 'None'}
可以看到最后一行,{'A': 'Baked', 'B': 'Beans'}已经写入文件中,并且没有指定的键值C,D,E那些都已经按照预设的restval设置正确。
这里只是涉及到csv的读写,那么xls文档该如何操作?下一次将学习该内容。