处理 CSV 文件和 JSON 数据

前言

CSV 和 JSON 文件是纯文本文件。 可以用文本编辑器察看它们,诸如 IDLE 的文件编辑器。但Python 也有专门的 csv 和 json 模块,每个模块都提供了一些函数,帮 助你处理这些文件格式。

一、csv模块

CSV 文件中的每行代表电子表格中的一行,逗号分割了该行中的单元格。CSV 文件是简单的,缺少 Excel 电子表格的许多功能。例如,CSV 文件中: 

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

CSV 的文件的优势是简单。CSV 文件被许多种类的程序广泛地支持,可以在文本编辑器中查看(包括 IDLE 的文件编辑器),它是表示电子表格数据的直接方式。 CSV 格式和它声称的完全一致:它就是一个文本文件,具有逗号分隔的值。 

因为 CSV 文件就是文本文件,所以你可能会尝试将它们读入一个字符串,然后处理这个字符串。例如,因为 CSV 文件中的每个单元格 有逗号分割,也许你可以只是对每行文本调用 split()方法,来取得这些值。但并非 CSV 文件中的每个逗号,都表示两个单元格之间的分界。CSV 文件也有自己的转义字符,允许逗号和其他字符作为值的一部分。split()方法不能处理这些转义字符。因为这些潜在的缺陷,所以总是应该使用 csv模块来读写 CSV 文件。

 

1、Reader 对象 

要用 csv 模块从 CSV 文件中读取数据,需要创建一个 Reader 对象。Reader 对 象让你迭代遍历 CSV 文件中的每一行。

csv 模块是 Python 自带的,所以不需要安装就可以导入它。

要用 csv 模块读取 CSV 文件,首先用 open()函数打开它,就像打开任何其他文本文件一样。但是,不用在 open()返回的 File 对象上调用 read()或 readlines()方法, 而是将它传递给 csv.reader()函数。这将返回一个 Reader 对象,供你使用。请注意, 不能直接将文件名字符串传递给 csv.reader()函数。 

要访问 Reader 对象中的值,最直接的方法,就是将它转换成一个普通 Python 列 表,即将它传递给 list()。在这个 Reader 对象上应用 list()函数,将返回一个列表 的列表。可以将它保存在变量 exampleData 中。如下:

import csv
import os
import pprint
os.chdir(r'C:\Users\Cherry\Desktop')

# 打开csv文件
exampleFile = open('example.csv')
# 获取一个Reader 对象
exampleReader = csv.reader(exampleFile)
# 要访问 Reader 对象中的值,最直接的方法,就是将它转换成一个普通 Python 列表
exampleData = list(exampleReader)
pprint.pprint(exampleData) # 漂亮打印

# 访问特定行和列的值
print(exampleData[0][1]) # 如访问第一行第二列的值(因为已经是list,索引从0开始)
print(exampleData[1][0])

# 得到结果:
[['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']]
Apples
4/5/2014 3:41

 

2、在 for 循环中,从 Reader 对象读取数据 

对于大型的 CSV 文件,你需要在一个 for 循环中使用 Reader 对象。这样避免 将整个文件一次性装入内存。

import csv
import os
import pprint
os.chdir(r'C:\Users\Cherry\Desktop')

# 打开csv文件
exampleFile = open('example.csv')
# 获取一个Reader 对象
exampleReader = csv.reader(exampleFile)
for row in exampleReader:
    print('Row #' + str(exampleReader.line_num) + ' ' + str(row))

# Reader 对象只能循环遍历一次,这里再次读取不到
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 对 象中的行。每一行是一个值的列表,每个值表示一个单元格。 

print()函数将打印出当前行的编号以及该行的内容。要取得行号,就使用 Reader 对象的 line_num 变量,它包含了当前行的编号。 

Reader 对象只能循环遍历一次。要再次读取 CSV 文件,必须调用 csv.reader,创 建一个对象。 

 

3、Writer 对象 

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

首先调用 open()并传入'w',以写模式打开一个文件。这将创建对象。然后 将它传递给 csv.writer(),创建一个 Writer 对象。 在 Windows 上,需要为 open()函数的 newline 关键字参数传入一个空字符串。 如果忘记设置 newline 关键字参数,output.csv 中的行距将有两倍。

Writer 对象的 writerow()方法接受一个列表参数。列表中的每个词,放在输出的 CSV 文件中的一个单元格中。writerow()函数的返回值,是写入文件中这一行的字 符数(包括换行字符)。 

import csv
import os
import pprint
os.chdir(r'C:\Users\Cherry\Desktop')
# 以写模式打开一个文件,创建一个对象
outputFile = open('output.csv', 'w', newline='') # 如果忘记设置 newline 关键字参数,output.csv 中的行距将有两倍
# 创建一个 Writer 对象
outputWriter = csv.writer(outputFile)
# Writer 对象的 writerow()方法接受一个列表参数
data = [['spam', 'eggs', 'bacon', 'ham'],['Hello, world!', 'eggs', 'bacon', 'ham'],[1, 2, 3.141592, 4]]
# outputWriter.writerow(['spam', 'eggs', 'bacon', 'ham'])
# outputWriter.writerow(['Hello, world!', 'eggs', 'bacon', 'ham'])
# outputWriter.writerow([1, 2, 3.141592, 4])
# 或者
for row in data:
    outputWriter.writerow(row)
outputFile.close()

请注意,Writer 对象自动转义了'Hello, world!'中的逗号,在 CSV 文件中使用了双引号。模块 csv 让你不必自己处理这些特殊情况。 

 

4、delimiter 和 lineterminator 关键字参数 

假定你希望用制表符代替逗号来分隔单元格,并希望有两倍行距。

import csv
import os
import pprint
os.chdir(r'C:\Users\Cherry\Desktop')
# 以写模式打开一个文件,创建一个对象
csvFile = open('example.csv', 'w', newline='') # 如果忘记设置 newline 关键字参数,output.csv 中的行距将有两倍
# 创建一个 Writer 对象
csvWriter = csv.writer(csvFile, delimiter='\t', lineterminator='\n\n')
# Writer 对象的 writerow()方法接受一个列表参数
data = [['spam', 'eggs', 'bacon', 'ham'],['Hello, world!', 'eggs', 'bacon', 'ham'],[1, 2, 3.141592, 4]]
# outputWriter.writerow(['spam', 'eggs', 'bacon', 'ham'])
# outputWriter.writerow(['Hello, world!', 'eggs', 'bacon', 'ham'])
# outputWriter.writerow([1, 2, 3.141592, 4])
# 或者
for row in data:
    csvWriter.writerow(row)
csvFile.close()

这改变了文件中的分隔符和行终止字符。分隔符是一行中单元格之间出现的字符。默认情况下,CSV 文件的分隔符是逗号。行终止字符是出现在行末的字符。默 认情况下,行终止字符是换行符。你可以利用 csv.writer()的 delimiter 和 lineterminator 关键字参数,将这些字符改成不同的值。 传入 delimeter='\t'和lineterminator='\n\n',这将单元格之间的字符改变为制表符, 将行之间的字符改变为两个换行符。

 

二、json模块

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

json提供四个功能:dumps, dump, loads, load

1、用 loads()函数读取 JSON 

要将包含 JSON 数据的字符串转换为 Python 的值,就将它传递给 json.loads()函数 。

JsonData = '{"name": "Zophie", "isCat": true, "miceCaught": 0, "felineIQ": null}'
import json
data = json.loads(JsonData)
print(data)

# 得到结果:
{'name': 'Zophie', 'isCat': True, 'miceCaught': 0, 'felineIQ': None}

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

2、用 dumps 函数写出 JSON 

json.dumps()函数(它表示“dump string”,而不是 “ dumps”)将一个 Python 值 转换成 JSON 格式的数据字符串。

pythonData = {'isCat': True, 'miceCaught': 0, 'name': 'Zophie', 'felineIQ': None}
import json
JsonData = json.dumps(pythonData)
print(type(JsonData))
print(JsonData)

# 得到结果:
<class 'str'>
{"isCat": true, "miceCaught": 0, "name": "Zophie", "felineIQ": null}

该值只能是以下基本 Python 数据类型之一:字典、列表、整型、浮点型、字符 串、布尔型或 None。

 3、处理文件json.drump()、json.load()

如果你要处理的是文件而不是字符串,你可以使用 json.dump()  json.load() 来编码和解码JSON数据。例如:

import os
import json
os.chdir(r'C:\Users\Cherry\Desktop')

data = {'isCat': True, 'miceCaught': 0, 'name': 'Zophie', 'felineIQ': None}

# 写入 JSON 数据
with open('data.json', 'w') as f:
    json.dump(data, f)

# 读取数据
with open('data.json', 'r') as f:
    data1 = json.load(f) # data 类型为 <class 'dict'>
print(data1)

# 得到结果:
{'isCat': True, 'miceCaught': 0, 'name': 'Zophie', 'felineIQ': None}

打开data.json,可查看到保存的数据为:{"isCat": true, "miceCaught": 0, "name": "Zophie", "felineIQ": null}

 

posted @ 2019-01-14 13:36  风聆  阅读(82)  评论(0)    收藏  举报