第14章 处理CSV文件和JSON数据

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”。

小项目:取得当前天气,并打印天气预报

  1. 连接 sys.argv 中的字符串,从命令行得到位置。
  2. 调用requests.get(),下载天气数据。
    • OpenWeatherMap.org提供了JSON格式的实时天气信息。程序只需要下载页面:http://api.openweathermap.org/data/2.5/forecast/daily?q=<Location>&cnt=3,其中<Location>是想查天气的城市。
  3. 调用json.loads(),将JSON数据转换为Python数据结构。
  4. 打印天气预报

上面外国网站永不了,另搜了百度天气接口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: "北京"
        }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容