Python学习:csv模块

简介

csv格式(Comma Separated Vaules)是电子表格与数据库数据中最常见的输入、输出文件格式。在RFC 4180规范推出之前很多年,csv格式文件就已经开始使用了。由于没有合理的标准,不用的应用程序生成的csv格式文件会存在细微的差别,这种差别会导致不同来源的csv格式文件的处理麻烦。但是尽管csv格式中的分隔符会变化,csv格式文件的大致格式是相似的,所以编写一个单独的模块来高效地处理此类数据,将程序员从读写数据的繁琐细节中解放出来,是有意义的。

csv模块实现了 csv格式表单数据的读写。其提供了诸如“以兼容 Excel 的方式输出数据文件”或“读取 Excel 程序输出的数据文件”的功能,程序员无需知道 Excel 所采用 csv格式的细节。此模块同样可以用于定义其他应用程序可用的 csv格式或定义特定需求的 csv格式。

模块内容

csv模块定义了以下的函数:

csv.reader(csvfile, dialect='excel', **fmtparams)
#方法返回一个reader对象,该对象可逐行遍历csvfile
#csvfile可以是支持迭代遍历,具有__next__方法的任何对象
#file对象,list对象都是合适的csvfile
#如果csvfile是file对象,则该file对象需使用参数 newline='' 打开
#可选参数dialect是用于不同的csv变种的特定参数组
#可选关键字参数fmtparams可以覆写当前变种格式中的单个格式设置
#从csv文件读取的内容以字符串列表的方式返回
#一个简单的例子
>>> import csv
>>> with open('eggs.csv', newline='') as csvfile:
...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
...     for row in spamreader:
...         print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam

csv.writer(csvfile, dialect='excel', **fmtparams)
#返回一个 writer 对象,该对象负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串
#csvfile可以是具有write方法的任何对象
#如果csvfile是file对象,则该file对象需使用参数 newline='' 打开
#一个简单的例子
import csv
with open('eggs.csv', 'w', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
    
csv.register_dialect(name[, dialect[, **fmtparams]])
#方法将dialect与name联系起来,name必须是字符串
#可以通过传递一个Dialect类的子类,或者关键字参数fmtparams,来确定dialect

csv.unregister_dialect(name)
#删除dialect与name的联系

csv.get_dialect(name)
#通过name获取dialect,方法返回不可变的Dialect对象

csv.list_dialects()
#返回已经注册的dialect列表
>>> import csv
>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']
>>>

csv.field_size_limit([new_limit])
#返回解析器当前允许的最大字段大小。如果指定了 new_limit,则它将成为新的最大字段大小

csv模块定义了以下的类:

class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
#创建一个对象,该对象在操作上类似于常规 reader,
#但是将每行中的信息映射到一个 dict,该 dict 的键由 fieldnames 可选参数给出
#参数fieldnames是序列,如果省略fieldnames,则文件 f 第一行中的值将用作字段名
#如果某一行中的字段多于字段名,则其余字段将放入列表中,字段名由 restkey 指定(默认为 None)
#如果非空白行的字段少于字段名,则缺少的值将用 None 填充

class csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
#创建一个对象,该对象在操作上类似常规 writer,但会将字典映射到输出行
#fieldnames 参数是由键组成的 序列,它指定字典中值的顺序
#这些值会按指定顺序传递给 writerow() 方法并写入文件 f
#如果字典缺少 fieldnames 中的键,则可选参数 restval 用于指定要写入的值
#如果传递给 writerow() 方法的字典的某些键在 fieldnames 中找不到
#则可选参数 extrasaction 用于指定要执行的操作
#如果将其设置为默认值 'raise',则会引发 ValueError
#如果将其设置为 'ignore',则字典中的其他键值将被忽略

csv模块定义了以下的常量:

csv.QUOTE_ALL
#指示 writer 对象给所有字段加上引号

csv.QUOTE_MINIMAL
#指示 writer 对象仅为包含特殊字符(例如 定界符、引号字符 或 行结束符 中的任何字符)的字段加上引号

csv.QUOTE_NONNUMERIC
#指示 writer 对象为所有非数字字段加上引号
#指示 reader 将所有未用引号引出的字段转换为 float 类型

csv.QUOTE_NONE
#指示 writer 对象不使用引号引出字段
#指示 reader 不对引号字符进行特殊处理

变种与格式参数

为了更加容易指定输入与输出记录的格式,特定的一组格式参数组合为一个dialect。一个dialect是一个Dialect类的子类。创建reader或者writer对象时,可以将某个字符串或者Dialect类的子类指定为dialect参数。

Dialect类支持的属性包括:

Dialect.delimiter
#一个用于分隔字段的单字符,默认为 ','

Dialect.doublequote
#控制出现在字段中的引号字符应该如何被引出
#当该属性为True,则双写引号字符
#当该属性为False,则在引号字符前放置转义符
#如果该属性为False,且转义符未指定,则会引出Error异常

Dialect.escapechar
#指定转义字符

Dialect.lineterminator
#放在 writer 产生的行的结尾,默认为 '\r\n'

Dialect.quotechar
#一个单字符,用于包住含有特殊字符的字段,特殊字符如 定界符 或 引号字符 或换行符。默认为 '"'

如果某个csv格式文件中,各个字段的分隔符不是默认的逗号,比如是“|”,则需要创建新的dialect,通过该新的dialect来读取csv文件。

import csv

csv.register_dialect('pipes', delimiter = '|')

with open('testdata.csv', 'r') as f:
    reader = csv.reader(f, dialect = 'pipes')
    for row in reader:
        print(row)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值