CSV
CSV(Comma-Separated Values)逗号分隔的值,是简化的电子表格,保存为纯文本文件。优势是简单。
CSV文件中:
- 值没有类型,所有东西都是字符串;
- 没有字体大小颜色的设置;
- 没有多个工作表;
- 不能指定单元格的宽度和高度;
- 不能合并单元格;
- 不能嵌入图像和图表。
csv模块是python自带的,不需要安装就可以导入。
读操作
- 要读取csv文件,手写用open()函数打开它,同文本文件一样。
- 读取不是调用read()或readlines()方法,而是将它传递给csv.reader()函数,返回一个Reader对象。
- 要访问Reader对象中的值,最直接的方法,就是将它转换成一个python的列表,即将它传递给list()。
- 然后就可以利用下标来访问特定的行列了。如下的exampleData[row][col]
- exampleData[0][0]访问的是excel表格的第一行第一列数据。
>>> exampleFile = open('csvTest.csv')
>>> exampleReader = csv.reader(exampleFile)
>>> exampleData = list(exampleReader)
>>> exampleData
[['2015', '1:02', 'Apples', '12'], ['123', '3:05', 'Cherries', '23'], ['456', '12:01', 'Oranges', '54']]
>>> exampleData[0][0]
'2015'
>>> exampleData[0][2]
'Apples'
>>> exampleFile.close()
Reader对象
- 对于大型的CSV文件,需要在一个for循环中使用Reader对象,这样可以避免将整个文件一次性装入内存。
>>> import csv
>>> exampleFile = open('csvTest.csv')
>>> exampleReader = csv.reader(exampleFile)
>>> for row in exampleReader:
>>> for row in exampleReader:
... print('Row #' + str(exampleReader.line_num) + ' ' + str(row))
...
Row #1 ['2015', '1:02', 'Apples', '12']
Row #2 ['123', '3:05', 'Cherries', '23']
Row #3 ['456', '12:01', 'Oranges', '54']
>>> exampleFile.close()
- Reader对象只能循环遍历一次,要再次读取CSV文件,必须调用csv.reader,再创建一个对象。
写操作
import csv
outputFile = open('output.csv','w', newline = '')
outputWriter = csv.writer(outputFile)
outputWriter.writerow(['123','abc','33bs','ham',3.13144])
outputWriter.writerow(['aaa','333','world','hdd','hellow'])
outputFile.close()
- 在Windows上,需要为open()函数的newline关键字参数传入一个空字符串。如果忘记设置newline关键字参数,output.csv中行距将有两倍,即每两行数据中间多处一个空行。
delimiter和lineterminator关键字参数
- 如果希望,用制表符来代替逗号分隔单元格,在使用csv.writer函数的时候,添加参数
delimiter = '\t', lineterminator = '\n'
import csv
outputFile = open('csvExample.tsv','w', newline = '')
outputWriter = csv.writer(outputFile, delimiter = '\t', lineterminator = '\n')
outputWriter.writerow(['123','abc','33bs','ham',3.13144])
outputWriter.writerow(['aaa','333','world','hdd','hellow'])
outputFile.close()
小项目:将文件夹中所有CSV文件内的表头删除,并存到新文件夹中
# 功能:遍历文件夹中所有CSV文件,从CSV文件中删除表头
import csv, os
os.makedirs('headerRemoved', exist_ok = True)
# 1.循环遍历当前目录下每个文件
for csvFilename in os.listdir('.'):
if not csvFilename.endswith('.csv'):
continue #跳过结尾不是.csv的文件
print('Removing header from ' + csvFilename + '...')
# 2.读CSV文件,除第一行外其余存入临时变量csvRows
csvRows = []
csvFileObj = open(csvFilename)
readerObj = csv.reader(csvFileObj)
for row in readerObj:
if readerObj.line_num == 1:
continue #第一行不写入临时变量csvRows
csvRows.append(row)
csvFileObj.close()
# 3.写入新CSV文件
csvFileObj = open(os.path.join('headerRemoved', csvFilename),'w',newline = '')
csvWriter = csv.writer(csvFileObj)
for row in csvRows:
csvWriter.writerow(row)
csvFileObj.close()
JSON和API
JSON是JavaScript程序编写数据结构的原生方式,通常类似于Python的pprint()函数产生的结果。
很多网站都提供JSON格式的内容,作为程序与网站交互的方式,这就是所谓的"应用程序编程接口(API)"。
JSON字符串总是用双引号,它将改数据返回一个Python字典,Python字典是没有顺序的,所以json.loads()后打印其返回值,键-值对可能以不同顺序出现。
- 用json.loads()函数读取JSON,意思是“load string”。
- 用json.dumps()函数写出JSON,意思是“dump string”。
小项目:取得当前天气,并打印天气预报
- 连接 sys.argv 中的字符串,从命令行得到位置。
- 调用requests.get(),下载天气数据。
- OpenWeatherMap.org提供了JSON格式的实时天气信息。程序只需要下载页面:
http://api.openweathermap.org/data/2.5/forecast/daily?q=<Location>&cnt=3
,其中<Location>
是想查天气的城市。
- OpenWeatherMap.org提供了JSON格式的实时天气信息。程序只需要下载页面:
- 调用json.loads(),将JSON数据转换为Python数据结构。
- 打印天气预报
上面外国网站永不了,另搜了百度天气接口api
以GET形式提交,返回JSON或XML
URL:http://api.map.baidu.com/telematics/v3/weather?location={城市名}&output={返回格式}&ak={百度AK}
广州JSON例子:http://api.map.baidu.com/telematics/v3/weather?location=广州&output=JSON&ak=FK9mkfdQsloEngodbFl4FeY3
广州XML例子:http://api.map.baidu.com/telematics/v3/weather?location=广州&output=XML&ak=FK9mkfdQsloEngodbFl4FeY3
JSON返回主要数据:
date:时间、currentCity:城市、pm25:pm2.5指数、index:各指数意见(穿衣、洗车、旅游、干嘛、运动、紫外线)、weather_data:四天内的天气情况(天气、温度、风向、参考图标)
实测发现,发现百度天气json数据的api接口被禁用了,所以只能用下面这个做测试了
http://wthrcdn.etouch.cn/weather_mini?city=%E5%8C%97%E4%BA%AC
# 功能:利用API得到JSON数据,取得当前天气数据,并打印天气预报
import json, requests, sys, pprint
# 1.从命令行读取请求的位置,命令行参数以空格分隔
if len(sys.argv) < 2:
print('Usage : quickWeather.py location')
sys.exit()
location = ' '.join(sys.argv[1:]) #命令行参数存在列表里是没有空格的,此处用空格来拼接它们
print(location)
# 2.下载JSON数据
url = 'http://wthrcdn.etouch.cn/weather_mini?city=%s' % (location)
response = requests.get(url)
response.raise_for_status()
pprint.pprint(response.text)
weatherData = json.loads(response.text) #观察json数据格式后发现温度存在在data的wendu中
w = weatherData['data']
print(w['wendu'])
上面代码保存为
quickWeather.py
,在命令行运行python quickWeather.py 北京
{
desc: "OK",
status: 1000,
data:
{
wendu: "5",
ganmao: "虽然温度适宜但风力较大,仍较易发生感冒,体质较弱的朋友请注意适当防护。",
forecast: [
{
fengxiang: "北风",
fengli: "微风级",
high: "高温 5℃",
type: "晴",
low: "低温 -4℃",
date: "8日星期天"
},
{
fengxiang: "南风",
fengli: "微风级",
high: "高温 3℃",
type: "晴",
low: "低温 -6℃",
date: "9日星期一"
},
{
fengxiang: "北风",
fengli: "微风级",
high: "高温 4℃",
type: "晴",
low: "低温 -6℃",
date: "10日星期二"
},
{
fengxiang: "南风",
fengli: "微风级",
high: "高温 4℃",
type: "晴",
low: "低温 -6℃",
date: "11日星期三"
},
{
fengxiang: "南风",
fengli: "微风级",
high: "高温 4℃",
type: "多云",
low: "低温 -5℃",
date: "12日星期四"
}
],
yesterday:
{
fl: "微风",
fx: "北风",
high: "高温 3℃",
type: "小雪",
low: "低温 -3℃",
date: "7日星期六"
},
aqi: "48",
city: "北京"
}
}