6.1 读写CSV数据
问题
你想读写一个CSV格式的文件。
解决方案
对于大多数的CSV格式的数据读写问题,都可以使用 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
"""
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.Symbol 和 row.Change 代替下标访问。 需要注意的是这个只有在列名是合法的Python标识符的时候才生效。如果不是的话, 你可能需要修改下原始的列名(如将非标识符字符替换成下划线之类的)。
另外一个选择就是将数据读取到一个字典序列中去。可以这样做:
在这个版本中,你可以使用列名去访问每一行的数据了。
为了写入CSV数据,你仍然可以使用csv模块,不过这时候先创建一个 writer 对象。例如:
如果你有一个字典序列的数据,可以像这样做:
讨论
你应该总是优先选择csv模块分割或解析CSV数据。
默认情况下,csv 库可识别Microsoft Excel所使用的CSV编码规则。 这或许也是最常见的形式,并且也会给你带来最好的兼容性。 然而,如果你查看csv的文档,就会发现有很多种方法将它应用到其他编码格式上(如修改分割字符等)。 例如,如果你想读取以tab分割的数据,可以这样做:
修正列标题,可以像下面这样在非法标识符上使用一个正则表达式替换:
还有重要的一点需要强调的是,csv产生的数据都是字符串类型的,它不会做任何其他类型的转换。
通常来讲,你可能并不想过多去考虑这些转换问题。 在实际情况中,CSV文件都或多或少有些缺失的数据,被破坏的数据以及其它一些让转换失败的问题。 因此,除非你的数据确实有保障是准确无误的,否则你必须考虑这些问题(你可能需要增加合适的错误处理机制)。
最后,如果你读取CSV数据的目的是做数据分析和统计的话, 你可能需要看一看 Pandas包。Pandas 包含了一个非常方便的函数叫 pandas.read_csv() , 它可以加载CSV数据到一个 DataFrame 对象中去。 然后利用这个对象你就可以生成各种形式的统计、过滤数据以及执行其他高级操作了。
Last updated
Was this helpful?