python的CSV模块
来源:互联网 发布:淘宝手机端网址 编辑:程序博客网 时间:2024/06/05 09:28
使用Python的CSV模块读写CSV文件
开发环境:Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
自序
也许你会说,我为什么要学习使用CSV模块呢?没有CSV模块我一样可以解析操作CSV文件,比如下面这种代码:
12345
with open('stocks.csv') as f:for line in f: row = line.split(',') # process row ...
使用这种方式的一个缺点就是你仍然需要去处理一些棘手的细节问题。比如,如果某些字段值被引号包围,你不得不去除这些引号。另外,如果一个被引号包围的字段碰巧含有一个逗号,那么程序就会因为产生一个错误而停止。
默认情况下,CSV
库可识别Microsoft Excel
所使用的CSV
编码规则。这或许也是最常见的形式,并且也会给你带来最好的兼容性。然而,如果你查看CSV
的文档,就会发现有很多种方法将它应用到其他编码格式上(如修改分隔字符等,用Tab分隔)。所以你应该总是优先选择CSV
模块分割或解析CSV
数据。
CSV格式简介
逗号分隔值(Comma-Separated Values
,CSV
,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV
文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
CSV文件注意点
如果你正在读取CSV
数据并将它们转换为命名元组,需要注意对列名进行合法性认证。一个CSV
格式文件有一个包含非法标识符的列头行,这样最终会导致在创建一个命名元组时产生一个ValueError
异常而失败。为了解决这问题,你可能不得不先去修正列标题。
123456789
import rewith open('stock.csv') as f: f_csv = csv.reader(f) headers = [ re.sub('[^a-zA-Z_]', '_', h) for h in next(f_csv) ] Row = namedtuple('Row', headers) for r in f_csv: row = Row(*r) # Process row ...
还有重要的一点需要强调的是,CSV
产生的数据都是字符串类型的,它不会做任何其他类型的转换。如果你需要做这样的类型转换,你必须自己手动去实现。
CSV模块操作示例
输入文件:stocks.csv
1234567
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
输出文件:dest.csv
1234
Symbol,Price,Date,Time,Change,VolumeAA,39.48,6/11/2007,9:36am,-0.18,181800AIG,71.38,6/11/2007,9:36am,-0.15,195500AXP,62.58,6/11/2007,9:36am,-0.46,935000
代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
#!/usr/bin/python# coding: UTF-8"""Created on 2015/9/30 14:55@author: 'WX'"""from collections import namedtupleimport csvif __name__ == "__main__": fileName = 'stocks.csv' writeFileName = 'dest.csv' with open(fileName) as f: reader = csv.reader(f) headers = next(reader) print("使用下标进行访问") for row in reader: # 可以使用下标进行访问,row是一个元组 length = len(row) for i in range(length): print(row[i], end='\t') print() print('------------------------------------------------') with open(fileName) as f: # 使用命名元组访问 reader = csv.reader(f) headers = next(reader) Row = namedtuple('Row', headers) print("使用命名元组进行访问") for r in reader: row = Row(*r) # 这时候就可以使用首行的列名来进行访问了 line = '%s\t%s\t%s\t%s\t%s\t%s' % (row.Symbol, row.Price, row.Date, row.Time, row.Change, row.Volume) print(line) print('------------------------------------------------') with open(fileName) as f: # 将内容读取到字典序列中,然后用key去读取 dict_reader = csv.DictReader(f) print("使用字典序列进行访问") for row in dict_reader: line = '%s\t%s\t%s\t%s\t%s\t%s' % ( row['Symbol'], row['Price'], row['Date'], row['Time'], row['Change'], row['Volume']) print(line) print('------------------------------------------------') print("使用元组方式写入,SUCCESS!") with open(writeFileName, mode='w', newline='') as wf: 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), ] writer = csv.writer(wf) writer.writerow(headers) writer.writerows(rows) print("使用字典方式写入,SUCCESS!") # 在Windows平台需要指定newline='',否则在两行内容之间会多出一行空行 with open(writeFileName, mode='w', newline='') as wf: 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}, ] writer = csv.DictWriter(wf, headers) writer.writeheader() writer.writerows(rows) # 更换一种分隔符写入文件 with open(writeFileName, mode='w', newline='') as wf: 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), ] writer = csv.writer(wf, delimiter=';') writer.writerow(headers) writer.writerows(rows) print("使用分好作为分隔符写入,SUCCESS!")
控制台输出
1234567891011121314151617181920212223242526272829
C:\Python34\python.exe E:/workspaces/Python3/edu/shu/python/shumo/CsvUtil.py使用下标进行访问AA 39.48 6/11/2007 9:36am -0.18 181800AIG 71.38 6/11/2007 9:36am -0.15 195500AXP 62.58 6/11/2007 9:36am -0.46 935000BA 98.31 6/11/2007 9:36am +0.12 104800C 53.08 6/11/2007 9:36am -0.25 360900CAT 78.29 6/11/2007 9:36am -0.23 225400------------------------------------------------使用命名元组进行访问AA 39.48 6/11/2007 9:36am -0.18 181800AIG 71.38 6/11/2007 9:36am -0.15 195500AXP 62.58 6/11/2007 9:36am -0.46 935000BA 98.31 6/11/2007 9:36am +0.12 104800C 53.08 6/11/2007 9:36am -0.25 360900CAT 78.29 6/11/2007 9:36am -0.23 225400------------------------------------------------使用字典序列进行访问AA 39.48 6/11/2007 9:36am -0.18 181800AIG 71.38 6/11/2007 9:36am -0.15 195500AXP 62.58 6/11/2007 9:36am -0.46 935000BA 98.31 6/11/2007 9:36am +0.12 104800C 53.08 6/11/2007 9:36am -0.25 360900CAT 78.29 6/11/2007 9:36am -0.23 225400------------------------------------------------使用元组方式写入,SUCCESS!使用字典方式写入,SUCCESS!Process finished with exit code 0
- Python的CSV模块
- Python的CSV模块
- python的CSV模块
- 举例说明Python的CSV模块
- 【Python】 csv模块的使用
- 举例说明Python的CSV模块
- python csv模块的使用
- 举例说明Python的CSV模块
- 【Python】 csv模块的使用
- Python csv模块的使用
- Python csv模块的使用
- 【Python】 csv模块的使用
- 【Python】 csv模块的使用
- 【Python】 csv模块的使用
- Python csv模块的使用
- Python中csv模块的用法
- Python csv 模块
- Python csv模块
- 一次分布式架构cms系统页面静态化模块开发经历
- Mob ShareSDK集成
- vmware上centos配置nginx后,本机访问问题
- mysql乐观锁总结和实践
- 数据挖掘概念汇总及数据预处理
- python的CSV模块
- PyTorch参数初始化和Finetune
- win7 vs2015 python2.7配置dlib19.4
- SSD: Single Shot MultiBox Detector 训练KITTI数据集(1)
- 关于jsp页面顶部出现空白问题
- App.Config详解及读写操作
- svchost.exe网速占用解决办法
- Spring MVC之@RequestBody, @ResponseBody 详解
- [maven][2017-03-24] eclipse下导入maven库