python3 读csv_用python3读写csv文档

对于大多数的CSV格式的数据读写问题,都可以使用 csv 库。

例如:假设你在一个名叫stocks.csv文件中有一些股票市场数据,就像这样:

Symbol,Price,Date,Time,Change,Volume

"AA",39.48,"6/11/2007","9:36am",-0.18,181800

"AIG",71.38,"6/11/2007","9:36am",-0.15,195500

"AXP",62.58,"6/11/2007","9:36am",-0.46,935000

"BA",98.31,"6/11/2007","9:36am",+0.12,104800

"C",53.08,"6/11/2007","9:36am",-0.25,360900

"CAT",78.29,"6/11/2007","9:36am",-0.23,225400

csv文档的读取

1. 常规读取

下面向你展示如何将这些数据读取为一个元组的序列:

import csv

with open('stocks.csv') as f:

f_csv = csv.reader(f)

headers = next(f_csv)

for row in f_csv:

# Process row

...

在上面的代码中, row 会是一个列表。因此,为了访问某个字段,你需要使用下标,如 row[0]访问Symbol, row[4] 访问Change。==这样可以通过外建字典来存储读出的csv数据。==

2. 命名元组

由于这种下标访问通常会引起混淆,你可以考虑使用==命名元组==。例如:

from collections import namedtuple

with open('stock.csv') as f:

f_csv = csv.reader(f)

headings = next(f_csv)

Row = namedtuple('Row', headings)

for r in f_csv:

row = Row(*r)

# Process row

...

它允许你使用列名如 row.Symbol 和 row.Change 代替下标访问。 需要注意的是这个只有在列名是合法的Python标识符的时候才生效。如果不是的话, 你可能需要修改下原始的列名(如将非标识符字符替换成下划线之类的)。

3. 字典

另外一个选择就是将数据读取到一个字典序列中去。可以这样做:

import csv

with open('stocks.csv') as f:

f_csv = csv.DictReader(f)

for row in f_csv:

# process row

...

在这个版本中,你可以使用列名去访问每一行的数据了。比如,row['Symbol'] 或者 row['Change']。

fieldnames 是dict_reader的一个属性,表示CSV文档的数据名称。可以通过f_csv.fieldnames来访问数据名称那一行。

CSV文件写入

为了写入CSV数据,你仍然可以使用csv模块,不过这时候先创建一个 writer 对象。例如:

headers = ['Symbol','Price','Date','Time','Change','Volume']

rows = [('AA', 39.48, '6/11/2007', '9:36am', -0.18, 181800),

('AIG', 71.38, '6/11/2007', '9:36am', -0.15, 195500),

('AXP', 62.58, '6/11/2007', '9:36am', -0.46, 935000),

]

with open('stocks.csv','w') as f:

f_csv = csv.writer(f)

f_csv.writerow(headers)

f_csv.writerows(rows)

如果你有一个字典序列的数据,可以像这样做:

headers = ['Symbol', 'Price', 'Date', 'Time', 'Change', 'Volume']

rows = [{'Symbol':'AA', 'Price':39.48, 'Date':'6/11/2007',

'Time':'9:36am', 'Change':-0.18, 'Volume':181800},

{'Symbol':'AIG', 'Price': 71.38, 'Date':'6/11/2007',

'Time':'9:36am', 'Change':-0.15, 'Volume': 195500},

{'Symbol':'AXP', 'Price': 62.58, 'Date':'6/11/2007',

'Time':'9:36am', 'Change':-0.46, 'Volume': 935000},

]

with open('stocks.csv','w') as f:

f_csv = csv.DictWriter(f, headers)

f_csv.writeheader()

f_csv.writerows(rows)

其中f_csv.writeheader()也可以替换成f_csv.writerow(dict(zip(headers, headers)))

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值