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 ValuesCSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。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
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 出国自驾游怎么办手续 新加坡开车工作遇到坏人怎么办 身份证户口本都丢了怎么办 户口本和身份证都丢了怎么办 网上预约挂完号没收到短信怎么办 驾驶证过了换证期限怎么办 身体弱末梢神经循环不好怎么办 自来水钙镁离子超标怎么办 呼吸感觉有煤烟味是怎么办 酒精弄到衣服上怎么办 孕妇吃了糟卤怎么办 气泡机打不了气怎么办 膝盖好冷好凉怎么办吃什么好 卸妆水进眼睛了怎么办 外出没带卸妆水怎么办? 种睫毛卸睫膏弄眼睛里面了 怎么办 化了妆没卸妆水怎么办 痘痘变成了黑痣怎么办 痘痘形成的痣怎么办 图片文件重命名改不了怎么办 想给宝宝改名字怎么办 洗照片像素过低怎么办 用ps改尺寸照片变形怎么办 平安银行卡三次密码错误怎么办 平安银行卡密码忘了怎么办 平安银行行用卡多次还款怎么办 平安银行大润发卡还不上怎么办 八载图片被投诉怎么办 ps用替换颜色后怎么办 三星s8百度闪退怎么办 吃了过敏的东西怎么办 过敏了痒的厉害怎么办 脸吃麻辣过敏了怎么办 脸过敏发红痒怎么办急救 脸过敏怎么办快速治疗方法 下巴起噶的过敏怎么办 药物过敏脸肿了怎么办 吃虾过敏全身痒怎么办 全身过敏怎么办 痒的厉害 吃小龙虾过敏全身痒怎么办 脸过敏肿起来了怎么办