Python csv json学习

csv

在一个 CSV 文件中,
看起来像这样:

4/5/2015 13:34,Apples,73
4/5/2015 3:41,Cherries,85
4/6/2015 12:46,Pears,14
4/8/2015 8:59,Oranges,52
4/10/2015 2:07,Apples,152
4/10/2015 18:10,Bananas,23
4/10/2015 2:40,Strawberries,98

CSV 文件中:
• 值没有类型,所有东西都是字符串;
• 没有字体大小或颜色的设置;
• 没有多个工作表;
• 不能指定单元格的宽度和高度;
• 不能合并单元格;
• 不能嵌入图像或图表。

reader

>>> import csv
>>> exampleFile = open('example.csv')
>>> exampleReader = csv.reader(exampleFile)
>>> exampleData = list(exampleReader)
>>> exampleData
[['4/5/2015 13:34', 'Apples', '73'], ['4/5/2015 3:41', 'Cherries', '85'],
['4/6/2015 12:46', 'Pears', '14'], ['4/8/2015 8:59', 'Oranges', '52'],
['4/10/2015 2:07', 'Apples', '152'], ['4/10/2015 18:10', 'Bananas', '23'],
['4/10/2015 2:40', 'Strawberries', '98']]

csv 模块是 Python 自带的,所以不需要安装就可以导入它。
要用 csv 模块读取 CSV 文件,首先用 open()函数打开它,就像打开任何其他
文本文件一样。但是,不用在 open()返回的 File 对象上调用 read()或 readlines()方法,
而是将它传递给 csv.reader()函数。这将返回一个 Reader 对象,供你使用。请注意,
不能直接将文件名字符串传递给 csv.reader()函数。
要访问 Reader 对象中的值,最直接的方法,就是将它转换成一个普通 Python 列
表,即将它传递给 list()。在这个 Reader 对象上应用 list()函数,将返回一个列表
的列表。可以将它保存在变量 exampleData 中。在交互式环境中输入 exampleData,
将显示列表的列表。
既然已经将 CSV 文件表示为列表的列表,就可以用表达式 exampleData
[row][col]来访问特定行和列的值。其中,row 是 exampleData 中一个列表的下标,
col 是该列表中你想访问的项的下标。在交互式环境中输入以下代码:

>>> exampleData[0][0]
'4/5/2015 13:34'
>>> exampleData[0][1]
'Apples'
>>> exampleData[0][2]
'73'
>>> exampleData[1][1]
'Cherries'
>>> exampleData[6][1]
'Strawberries'

exampleData[0][0]进入第一个列表,并给出第一个字符串。exampleData[0][2]进入
第一个列表,并给出第三个字符串,以此类推。

在 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/2015 13:34', 'Apples', '73']
Row #2 ['4/5/2015 3:41', 'Cherries', '85']
Row #3 ['4/6/2015 12:46', 'Pears', '14']
Row #4 ['4/8/2015 8:59', 'Oranges', '52']
Row #5 ['4/10/2015 2:07', 'Apples', '152']
Row #6 ['4/10/2015 18:10', 'Bananas', '23']
Row #7 ['4/10/2015 2:40', 'Strawberries', '98']

在导入 csv 模块,并从 CSV 文件得到 Reader 对象之后,可以循环遍历 Reader 对
象中的行。每一行是一个值的列表,每个值表示一个单元格。
print()函数将打印出当前行的编号以及该行的内容。要取得行号,就使用 Reader
对象的 line_num 变量
,它包含了当前行的编号。
Reader 对象只能循环遍历一次。要再次读取 CSV 文件,必须调用 csv.reader,创
建一个对象。

Writer 对象

Writer 对象让你将数据写入 CSV 文件。要创建一个 Writer 对象,就使用csv.writer()函数

import csv
>>> outputFile = open('output.csv', 'w', newline='')
>>> outputWriter = csv.writer(outputFile)
>>> outputWriter.writerow(['spam', 'eggs', 'bacon', 'ham'])
21
>>> outputWriter.writerow(['Hello, world!', 'eggs', 'bacon', 'ham'])
32
>>> outputWriter.writerow([1, 2, 3.141592, 4])
16
>>> outputFile.close()

首先,调用 open()并传入’w’,以写模式打开一个文件。这将创建对象。然后
将它传递给 csv.writer(),创建一个 Writer 对象。在 Windows 上,需要为 open()函数的 newline 关键字参数传入一个空字符串。这样做的技术原因超出了本书的范围。如果忘记设置 newline 关键字参数,output.csv中的行距将有两倍,如图 14-1 所示。
14-1
riter 对象的 writerow()方法接受一个列表参数。列表中的每个词,放在输出的
CSV 文件中的一个单元格中。writerow()函数的返回值,是写入文件中这一行的字
符数(包括换行字符)。

delimiter 和 lineterminator 关键字参数

假定你希望用制表符代替逗号来分隔单元格,并希望有两倍行距。可以在交互
式环境中输入下面这样的代码:

import csv
csvFile = open('C:/Users/hanson/Desktop/1/example.tsv', 'w', newline='')
csvWriter = csv.writer(csvFile, delimiter='\t', lineterminator='\n\n')
csvWriter.writerow(['apples', 'oranges', 'grapes'])
csvWriter.writerow(['eggs', 'bacon', 'ham'])
csvWriter.writerow(['spam', 'spam', 'spam', 'spam', 'spam', 'spam'])
csvFile.close()

这改变了文件中的分隔符和行终止字符。分隔符是一行中单元格之间出现的字
符。默认情况下,CSV 文件的分隔符是逗号。行终止字符是出现在行末的字符。默
认情况下,行终止字符是换行符。你可以利用 csv.writer()的 delimiter 和 lineterminator
关键字参数,将这些字符改成不同的值。传入 delimeter=’\t’和 lineterminator=’\n\n’,这将单元格之间的字符改变为制表符,将行之间的字符改变为两个换行符。然后我们调用writerow()三次,得到3 行。
这产生了文件 example.tsv,包含以下内容:

apples oranges grapes
eggs bacon ham
spam spam spam spam spam spam

既然单元格是由制表符分隔的,我们就使用文件扩展名.tsv,表示制表符分隔的值。

json 模块

Python 的 json 模块处理了 JSON 数据字符串和 Python 值之间转换的所有细节,
得到了 json.loads()和 json.dumps()函数。JSON 不能存储每一种 Python 值,它只能
包含以下数据类型的值:字符串、整型、浮点型、布尔型、列表、字典和 NoneType。
JSON 不能表示 Python 特有的对象,如 File 对象、CSV Reader 或 Writer 对象、Regex
对象或 Selenium WebElement 对象。

用 loads()函数读取 JSON
要将包含 JSON 数据的字符串转换为Python 的值,就将它传递给 json.loads()函数
(这个名字的意思是“load string”,而不 是“loads”)。在交互式环境中输入以下代码:

>>> stringOfJsonData = '{"name": "Zophie", "isCat": true, "miceCaught": 0,
"felineIQ": null}'
>>> import json
>>> jsonDataAsPythonValue = json.loads(stringOfJsonData)
>>> jsonDataAsPythonValue
{'isCat': True, 'miceCaught': 0, 'name': 'Zophie', 'felineIQ': None}

导入 json 模块后,就可以调用 loads(),向它传入一个 JSON 数据字符串。请注
意,JSON 字符串总是用双引号。它将该数据返回为一个 Python 字典。Python 字典是
没有顺序的,所以如果打印 jsonDataAsPythonValue,键-值对可能以不同的顺序出现。

用 dumps 函数写出 JSON
json.dumps()函数(它表示“dump string”,而不是 “dumps”)将一个 Python 值
转换成 JSON 格式的数据字符串。在交互式环境中输入以下代码:

>>> pythonValue = {'isCat': True, 'miceCaught': 0, 'name': 'Zophie',
'felineIQ': None}
>>> import json
>>> stringOfJsonData = json.dumps(pythonValue)
>>> stringOfJsonData
'{"isCat": true, "felineIQ": null, "miceCaught": 0, "name": "Zophie" }'

猜你喜欢

转载自blog.csdn.net/SeeUa/article/details/88792523