16.1:CSV模块
CSV和Excel相比:
- 值没有类型,所有东西都是字符串
- 没有字体大小和颜色设置
- 没有多个工作表
- 不能指定单元格的宽度和高度
- 不能合并单元格
- 不能嵌入图像或图表
CSV文件的优势就是简单,被多种程序广泛支持,可以在文本编辑器中查看,它是表示电子表格数据的直接方式。
16.1.1:reader对象
import csv
exampleFile = open('example.csv')
exampleReader = csv.reader(exampleFile)
print(list(exampleReader))
要用CSV模块从CSV文件中读取数据,需要一个reader对象。
reader对象可以让你迭代遍历CSV文件中的每一行
不能将文件名的字符串传递给csv.reader函数。
16.1.2:在for循环中,从reader对象读取数据
import csv
exampleFile = open('example.csv')
exampleReader = csv.reader(exampleFile)
for row in exampleReader:
print('Row #' + str(exampleReader.line_num) + ' ' + str(row))
reader对象的line_num属性可以获取当前行的编号
16.1.3:writer对象
import csv
outputFile = open('output.csv', 'w', newline='')
outputWriter = csv.writer(outputFile)
outputWriter.writerow(['spam', 'eggs'])
outputWriter.writerow(['hello,word', 'eggs'])
outputFile.close()
要用CSV模块从CSV文件中写入数据,需要一个writer对象,并且文件要以写的方式打开。
writerrow()函数接收一个参数列表,列表中的每个词放在CSV文件中的一个单元格中,函数返回的是写入文件的这一行的字符数。
16.1.4:delimiter和lineterminator关键字参数
import csv
csvFile = open('example.tsv', 'w', newline='')
outputWriter = csv.writer(csvFile, delimiter='\t', lineterminator='\n\n')
outputWriter.writerow(['spam', 'eggs'])
outputWriter.writerow(['hello,word', 'eggs'])
csvFile.close()
delimiter参数:设置字符之间的制表符。
lineterminator参数:设置行之间的字符
16.1.5:DictReader和DictWriter
import csv
exampleFile = open('example.csv')
exampleDictReader = csv.DictReader(exampleFile, ['time', 'name', 'amount'])
for row in exampleDictReader:
print(row['time'], row['name'], row['amount'])
DictReader对象使用字典方式进行读文件将默认csv文件的第一行作为字典的键,如果csv文件没有标题,也可以自行创建标题
import csv
outputFile = open('output.csv', 'w', newline='')
outputDictWriter = csv.DictWriter(outputFile, ['time', 'name', 'amount'])
outputDictWriter.writeheader()
outputDictWriter.writerow({'time': 'spam', 'name': 'eggs', 'amount': '555'})
outputDictWriter.writerow({'time': 'bus', 'name': 'tea', 'amount': '666'})
outputFile.close()
DictWriter对象使用字典方式进行写文件,传入一个字典作为标题使用的键
writerheader()方法:如果想让文件包含标题,就调用这个方法
16.2:项目:从csv文件中删除标题行
import csv, os
os.makedirs('headerRemoved', exist_ok=True)
for csvFilename in os.listdir('.'):
if not csvFilename.endswith('.csv'):
continue
print(csvFilename)
csvRows = []
csvFileObj = open(csvFilename)
readerObj = csv.reader(csvFileObj)
for row in readerObj:
if readerObj.line_num == 1:
continue
csvRows.append(row)
csvFileObj.close()
csvFileObj = open(os.path.join('headerRemoved', csvFilename), 'w', newline='')
csvWriter = csv.writer(csvFileObj)
for row in csvRows:
csvWriter.writerow(row)
csvFileObj.close()
16.3:JSON和API
16.4:json模块
json不能存储每一种python值,它只能包含:字符串、整型、浮点型、布尔型、列表、字典和NoneType。JSON不能表示python特有的对象。
16.4.1:用loads()函数读取JSON
stringOfJsonData = '{"name": "Zophie", "isCat": true, "miceCaught": 0, "felineIQ": null}'
import json
jsonDataAsPythonValue = json.loads(stringOfJsonData)
print(jsonDataAsPythonValue)
要将包含JSON数据的字符串转换为python的值,就要将它传递给loads()函数
16.4.2:用dumps函数写出JSON
pythonVallue = {'isCat': True, 'miceCaught': 0, 'name': 'Zophie', 'felinIQ': None}
import json
stringOfJsonData = json.dumps(pythonVallue)
print(stringOfJsonData)
dumps()函数将一个python值转换成JSON格式的数据字符串,该值只能是:字典、列表、整型、浮点型、字符串、布尔型或None。
16.5:项目:取得当前的天气数据
import json, requests, sys
APPID = 'YOUR_APPID_HERE'
if len(sys.argv) < 2:
print('Usage: getOpenWeather.py city_name, 2-letter_country_code')
sys.exit()
location = ' '.join(sys.argv[1:])
url = 'http://aip.op***data?q=%scnt=3&APPID=%s' % (location, APPID)
# 由于书上也是用***表示,所有需要自己找网站
requests = requests.get(url)
requests.raise_for_status()
print(requests.text)
weatherData = json.loads(requests.text)
w = weatherData['list']
print('Current weather in %s' % (location))
print(w[0]['weather'][0]['main'], '-', w[1]['weather'][0]['description'])
print()