《Python编程快速上手》
处理CSV文件和JSON数据
CSV文件时简化的电子表格,保存为纯文本文件。
JSOn它以Javascript源代码的形式,将信息保存在纯文本文件中。
CSV文件时简单的,缺少Excel电子表格的许多功能。例如,CSV文件中:
- 值没有类型,所有东西都是字符串
- 没有字体大小或颜色的设置
- 没有多个工作表
- 不能指定单元格的宽度和高度
- 不能合并单元格
- 不能嵌入图片或图表
CSV的文件的优势时简单。
1.读取CSV文件
要用csv模块从CSV文件中读取数据,需要创建一个Reader对象。Reader对象让你迭代遍历CSV文件中的每一行。
import csv
exampleFile = open('example.csv')
exampleReader = csv.reader(exampleFile)
exampleData = list(exampleReader)
exampleData
>> [['4/5/2014 13:34', 'Apples', '73'],
['4/5/2014 3:41', 'Cherries', '85'],
['4/6/2014 12:46', 'Pears', '14'],
['4/8/2014 8:59', 'Oranges', '52'],
['4/10/2014 2:07', 'Apples', '152'],
['4/10/2014 18:10', 'Bananas', '23'],
['4/10/2014 2:40', 'Strawberries', '98']]
要访问Reader对象中的值,最直接的方法,就是将它转换成一个普通的Python列表,即将它传递给list()。
既然已经将CSV文件表示为列表的列表,就可以用表达式exampleData[row][col]
来访问特定行和列的值。
exampleData[0][0]
>> '4/5/2014 13:34'
exampleData[0][1]
>> 'Apples'
exampleData[0][2]
>> '73'
exampleData[1][1]
>> 'Cherries'
exampleData[6][1]
>> 'Strawberries'
在for循环中,从Reader对象读取数据
对于大型的CSV文件,你需要在一个for循环中使用Reader对象。这样避免将整个文件一次性装入内存。
import csv
exampleFile = open('example.csv')
exampleReader = csv.reader(exampleFile)
for row in exampleReader:
print('Row #' + str(exampleReader.line_num) + ' ' + str(row))
>> Row #1 ['4/5/2014 13:34', 'Apples', '73']
Row #2 ['4/5/2014 3:41', 'Cherries', '85']
Row #3 ['4/6/2014 12:46', 'Pears', '14']
Row #4 ['4/8/2014 8:59', 'Oranges', '52']
Row #5 ['4/10/2014 2:07', 'Apples', '152']
Row #6 ['4/10/2014 18:10', 'Bananas', '23']
Row #7 ['4/10/2014 2:40', 'Strawberries', '98']
在导入csv模块,并从CSV文件得到Reader对象之后,可以循环遍历Reader对象中的行。每一行是一个值的列表,每个值表示一个单元格。
注意:Reader只能循环遍历一次。要再次读取CSV文件,必须调用csv.reader,创建一个对象。
2.写入CSV文件
Writer对象让你将数据写入CSV文件。要创建一个Writer对象,就使用csv.write()函数。
import csv
outputFile = open('output.csv','w',newline='')
outputWriter = csv.writer(outputFile)
outputWriter.writerow(['spam','eggs','bacon','ham'])
outputFile.close()
如果忘记设置newline关键字参数,output.csv中的行距将有两倍。
delimiter和lineterminator关键字参数
如果你希望设置分隔单元格的样式和对行距进行设置,可以使用delimiter和lineterminator关键字参数。例如delimiter=’\t’就是使用制表符代替逗号来分隔单元格,lineterminator=’\n\n’就是设置两倍行距。
import csv
outputFile = open('output1.csv','w',newline='')
outputWriter = csv.writer(outputFile,delimiter='\t',lineterminator='\n\n')
outputWriter.writerow(['spam','eggs','bacon','ham'])
outputWriter.writerow(['spam','eggs','bacon','ham'])
outputWriter.writerow(['spam','eggs','bacon','ham'])
outputFile.close()
3.JSON数据处理
json.loads()读取JSON数据和json.dumps()写出JSON数据。
JSON不能存储每一种Python值,它只能包含以下数据类型的值:字符串、整型、浮点型、布尔型、列表、字典和NoneType。JSON不能代表Python特有的对象,如File对象、CSV Reader或Writer对象、Regex对象或Selenium WebElement对象。
用load()函数读取JSON
要将包含JSON数据的字符串转换为Python的值。
stringOfJsonData = '{"name":"Zophie","isCat":true,"miceCaught":0,"felineIQ":null}'
stringOfJsonData
>> '{"name":"Zophie","isCat":true,"miceCaught":0,"felineIQ":null}'
import json
jsonDataAsPythonValue = json.loads(stringOfJsonData)
jsonDataAsPythonValue
>> {'felineIQ': None, 'isCat': True, 'miceCaught': 0, 'name': 'Zophie'}
请注意,JSON字符串总是用双引号。它将该数据返回一个Python字典。
用dumps()函数写出JSON
将一个Python值转换成JSON格式的数据字符串。该值只能时以下基本Python数据类型之一:字典、列表、整型、浮点型、字符串、布尔型或None。
pythonValue = {'felineIQ': None, 'isCat': True, 'miceCaught': 0, 'name': 'Zophie'}
import json
stringOfJsonData = json.dumps(pythonValue)
stringOfJsonData
>> '{"felineIQ": null, "isCat": true, "miceCaught": 0, "name": "Zophie"}'