简介
csv文件具有格式简单,快速存取,兼容性好等特点,工程、金融、商业等很多数据文件都是采用csv文件保存和处理。工作中数据处理也用到了csv,简要总结下使用经验,特别是那些由于本地兼容性导致的与官方文档的差异使用。
csv(comma Seperated Values)文件的格式非常简单,类似一个文本文档,每一行保存一条数据,同一行中的各个数据通常采用逗号(或tab)分隔。
与Python相关
python自带了csv模块,专门用于处理csv文件的读取和存档。
csv模块中,主要由两种方式存取csv文件:函数方法;类方法。
常用函数
读操作
csv.reader(csvfile,dialect ='excel',** fmtparams)
返回一个reader对象,它将迭代给定csvfile中的行。
csvfile可以是任何支持迭代器协议的对象,并在每次next()调用其方法时返回一个字符串- 文件对象和列表对象都是合适的。如果csvfile是一个文件对象,那么它必须在平台上以“b”标志打开,这会产生影响。可以给出可选的 dialect 参数,该参数用于定义特定于CSV方言的一组参数。它可以是类的子类的实例,也可以是函数Dialect返回的字符串之一 list_dialects()。其他可选的fmtparams可以给出关键字参数来覆盖当前方言中的各个格式参数。
import csv
with open('erroe.csv','rb') as csvred:
spam = csv.reader(csvred,delimiter=' ', quotechar='|')
for rem in spam:
print ','.join(rem)
写操作
csv.writer(csvfile,dialect ='excel',** fmtparams)
返回一个编写器对象,负责将用户的数据转换为给定的类文件对象上的分隔字符串。
csvfile可以是带有write()方法的任何对象 。如果csvfile是一个文件对象,那么它必须在平台上以“b”标志打开,这会产生影响。 可以给出可选的dialect参数,该参数用于定义特定于CSV方言的一组参数。它可以是类的子类的实例,也可以是函数Dialect返回的字符串之一 list_dialects()。可以给出其他可选的fmtparams关键字参数来覆盖当前dialect中的各个格式参数。
import csv
with open('error.csv', 'wb') 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必须是字符串或Unicode对象。dialect可以通过传递子类Dialect,或通过fmtparams关键字参数或两者来指定,并使用关键字参数覆盖dialect的参数 - csv.unregister_dialect(name)
从dialect注册表中删除与名称关联的dialect。如果name不是已注册的dialect名称,则引发An 错误 - csv.get_dialect(name)
返回与name相关的dialect。如果name 不是已注册的dialect名称,则引发An 错误 - csv.list_dialects()
返回所有已注册dialect的名称 - csv.field_size_limit([new_limit])
返回解析器允许的当前最大字段大小。如果给出new_limit,则这将成为新限制
常用类
读操作
class csv.DictReader(f,fieldnames = None,restkey = None,restval = None,dialect ='excel',* args,** kwds)
创建一个像常规阅读器一样操作的对象,但将读取的信息映射到一个dict,其键由可选的 fieldnames参数给出。字段名的参数是一个序列,其元素与输入数据的顺序中的字段相关联。这些元素成为结果字典的关键。如果省略fieldnames参数,则文件f的第一行中的值将用作字段名。如果读取的行包含的字段多于字段名序列,则将剩余数据添加为由restkey值键入的序列。如果读取的行的字段数少于字段名序列,则其余的键将采用可选的restval参数的值。任何其他可选或关键字参数都将传递给基础reader
实例。
import csv
with open('/Users/mioji/Desktop/api_error/error.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row['apan'], row['spam'])
写操作
class csv.DictWriter(f,fieldnames,restval ='',extrasaction ='raise',dialect ='excel',* args,** kwds)
创建一个像常规编写器一样操作的对象,但将字典映射到输出行。的字段名的参数是一个序列识别在哪些值在传递给字典中的顺序按键的writerow()方法被写入到文件˚F。如果字典缺少字段名中的键,则可选的restval参数指定要写入的值。如果传递给方法的字典包含在字段名中找不到的键,则可选的extrasaction参数指示要采取的操作。如果设置为a 则被提升。如果设置为writerow()'raise'ValueError'ignore',字典中的额外值将被忽略。任何其他可选或关键字参数都将传递给基础 writer实例。
请注意,与DictReader类不同,它的fieldnames参数DictWriter不是可选的。由于Python的dict 对象没有排序,因此没有足够的信息来推断应该将行写入文件f的顺序。
import csv
with open('names.csv', 'w') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
其他
- class csv.Dialect
Dialect类是依赖于主要用于它的属性,这是用来定义一个特定的参数的容器类 reader或writer实例 - class csv.excel
在excel类定义的Excel生成CSV文件的通常的性质。它以方言名称注册'excel'。 - class csv.excel_tab
excel_tab类定义Excel生成的制表符分隔的文件的通常的性质。它以方言名称注册'excel-tab'。 - class csv.Sniffer
Sniffer类用来推断一个CSV文件的格式。
Sniffer类提供了两个方法:
sniff(样本,分隔符=无):分析给定的样本并返回Dialect反映找到的参数的子类。如果给出了可选的delimiters参数,则将其解释为包含可能的有效分隔符的字符串。
has_header(样本):分析示例文本(假定为CSV格式), True如果第一行看起来是一系列列标题,则返回。
常量
- csv.QUOTE_ALL
指示writer对象引用所有字段。 - csv.QUOTE_MINIMAL
指示writer对象只引用那些包含特殊字符,如字段分隔符,quotechar或任何字符 lineterminator。 - csv.QUOTE_NONNUMERIC
指示writer对象引用所有非数字字段。
指示读者将所有非引用字段转换为float类型。 - csv.QUOTE_NONE
指示writer对象永远不引用字段。当输出数据中出现当前 分隔符时,它前面是当前的escapechar 字符。如果未设置escapechar,则Error在遇到需要转义的任何字符时,编写器将引发。
指示reader不对引号字符执行特殊处理。