csv --- CSV 文件读写— Python 3.8.14 說明文件

文章推薦指數: 80 %
投票人數:10人

csv 模块中的 reader 类和 writer 类可用于读写序列化的数据。

也可使用 DictReader 类和 DictWriter 类以字典的形式读写数据。

也參考. 该实现在“Python 增强提议” ... 瀏覽 索引 模組| 下一頁| 上一頁| Python» 3.8.14Documentation» Python標準函式庫(StandardLibrary)» 檔案格式» | csv---CSV文件读写¶ 源代码:Lib/csv.py CSV(CommaSeparatedValues)格式是电子表格和数据库中最常见的输入、输出文件格式。

在RFC4180规范推出的很多年前,CSV格式就已经被开始使用了,由于当时并没有合理的标准,不同应用程序读写的数据会存在细微的差别。

这种差别让处理多个来源的CSV文件变得困难。

但尽管分隔符会变化,此类文件的大致格式是相似的,所以编写一个单独的模块以高效处理此类数据,将程序员从读写数据的繁琐细节中解放出来是有可能的。

csv模块实现了CSV格式表单数据的读写。

其提供了诸如“以兼容Excel的方式输出数据文件”或“读取Excel程序输出的数据文件”的功能,程序员无需知道Excel所采用CSV格式的细节。

此模块同样可以用于定义其他应用程序可用的CSV格式或定义特定需求的CSV格式。

csv模块中的reader 类和writer类可用于读写序列化的数据。

也可使用DictReader类和DictWriter 类以字典的形式读写数据。

也參考 该实现在“Python增强提议”-PEP305(CSV文件API)中被提出《Python增强提议》提出了对Python的这一补充。

模块内容¶ csv模块定义了以下函数: csv.reader(csvfile,dialect='excel',**fmtparams)¶ 返回一个reader对象,该对象将逐行遍历csvfile。

csvfile可以是任何对象,只要这个对象支持iterator协议并在每次调用__next__()方法时都返回字符串,文件对象和列表对象均适用。

如果csvfile是文件对象,则打开它时应使用newline=''。

1可选参数dialect是用于不同的CSV变种的特定参数组。

它可以是Dialect类的子类的实例,也可以是list_dialects()函数返回的字符串之一。

另一个可选关键字参数fmtparams可以覆写当前变种格式中的单个格式设置。

有关变种和格式设置参数的完整详细信息,请参见变种与格式参数部分。

csv文件的每一行都读取为一个由字符串组成的列表。

除非指定了QUOTE_NONNUMERIC格式选项(在这种情况下,未加引号的字段会转换为浮点数),否则不会执行自动数据类型转换。

一个简短的用法示例: >>>importcsv >>>withopen('eggs.csv',newline='')ascsvfile: ...spamreader=csv.reader(csvfile,delimiter='',quotechar='|') ...forrowinspamreader: ...print(','.join(row)) Spam,Spam,Spam,Spam,Spam,BakedBeans Spam,LovelySpam,WonderfulSpam csv.writer(csvfile,dialect='excel',**fmtparams)¶ 返回一个writer对象,该对象负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串。

csvfile可以是具有write()方法的任何对象。

如果csvfile是文件对象,则打开它时应使用newline=''。

1可选参数dialect是用于不同的CSV变种的特定参数组。

它可以是Dialect类的子类的实例,也可以是list_dialects()函数返回的字符串之一。

另一个可选关键字参数fmtparams可以覆写当前变种格式中的单个格式设置。

有关变种和格式设置参数的完整详细信息,请参见变种与格式参数部分。

为了尽量简化与数据库API模块之间的对接,None值会写入为空字符串。

虽然这个转换是不可逆的,但它让SQL空数据值转储到CSV文件更容易,而无需预处理从cursor.fetch*调用返回的数据。

写入前,所有非字符串数据都先用str()转化为字符串再写入。

一个简短的用法示例: importcsv withopen('eggs.csv','w',newline='')ascsvfile: spamwriter=csv.writer(csvfile,delimiter='', quotechar='|',quoting=csv.QUOTE_MINIMAL) spamwriter.writerow(['Spam']*5+['BakedBeans']) spamwriter.writerow(['Spam','LovelySpam','WonderfulSpam']) csv.register_dialect(name[,dialect[,**fmtparams]])¶ 将name与dialect关联起来。

name必须是字符串。

要指定变种(dialect),可以给出Dialect的子类,或给出fmtparams关键字参数,或两者都给出(此时关键字参数会覆盖dialect参数)。

有关变种和格式设置参数的完整详细信息,请参见变种与格式参数部分。

csv.unregister_dialect(name)¶ 从变种注册表中删除name对应的变种。

如果name不是已注册的变种名称,则抛出Error异常。

csv.get_dialect(name)¶ 返回name对应的变种。

如果name不是已注册的变种名称,则抛出Error异常。

该函数返回的是不可变的Dialect对象。

csv.list_dialects()¶ 返回所有已注册变种的名称。

csv.field_size_limit([new_limit])¶ 返回解析器当前允许的最大字段大小。

如果指定了new_limit,则它将成为新的最大字段大小。

csv模块定义了以下类: classcsv.DictReader(f,fieldnames=None,restkey=None,restval=None,dialect='excel',*args,**kwds)¶ 创建一个对象,该对象在操作上类似于常规reader,但是将每行中的信息映射到一个dict,该dict的键由fieldnames 可选参数给出。

fieldnames参数是一个sequence。

如果省略fieldnames,则文件f第一行中的值将用作字段名。

无论字段名是如何确定的,字典都将保留其原始顺序。

如果某一行中的字段多于字段名,则剩余数据会被放入一个列表,并与restkey所指定的字段名(默认为None)一起保存。

如果某个非空白行的字段少于字段名,则缺失的值会使用restval的值来填充(默认为None)。

所有其他可选或关键字参数都传递给底层的reader实例。

3.6版更變:返回的行现在的类型是OrderedDict。

3.8版更變:现在,返回的行是dict类型。

一个简短的用法示例: >>>importcsv >>>withopen('names.csv',newline='')ascsvfile: ...reader=csv.DictReader(csvfile) ...forrowinreader: ...print(row['first_name'],row['last_name']) ... EricIdle JohnCleese >>>print(row) {'first_name':'John','last_name':'Cleese'} classcsv.DictWriter(f,fieldnames,restval='',extrasaction='raise',dialect='excel',*args,**kwds)¶ 创建一个对象,该对象在操作上类似常规writer,但会将字典映射到输出行。

fieldnames参数是由键组成的序列,它指定字典中值的顺序,这些值会按指定顺序传递给writerow()方法并写入文件f。

如果字典缺少fieldnames中的键,则可选参数restval用于指定要写入的值。

如果传递给writerow()方法的字典的某些键在fieldnames中找不到,则可选参数extrasaction用于指定要执行的操作。

如果将其设置为默认值'raise',则会引发ValueError。

如果将其设置为'ignore',则字典中的其他键值将被忽略。

所有其他可选或关键字参数都传递给底层的writer实例。

注意,与DictReader类不同,DictWriter类的fieldnames参数不是可选参数。

一个简短的用法示例: importcsv withopen('names.csv','w',newline='')ascsvfile: 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'}) classcsv.Dialect¶ Dialect类是主要依赖于其属性的容器类,用于将定义好的参数传递给特定的reader或writer实例。

classcsv.excel¶ excel类定义了Excel生成的CSV文件的常规属性。

它在变种注册表中的名称是'excel'。

classcsv.excel_tab¶ excel_tab类定义了Excel生成的、制表符分隔的CSV文件的常规属性。

它在变种注册表中的名称是'excel-tab'。

classcsv.unix_dialect¶ unix_dialect类定义了在UNIX系统上生成的CSV文件的常规属性,即使用'\n'作为换行符,且所有字段都有引号包围。

它在变种注册表中的名称是'unix'。

3.2版新加入. classcsv.Sniffer¶ Sniffer类用于推断CSV文件的格式。

Sniffer类提供了两个方法: sniff(sample,delimiters=None)¶ 分析给定的sample并返回一个Dialect子类,该子类中包含了分析出的格式参数。

如果给出可选的delimiters参数,则该参数会被解释为字符串,该字符串包含了可能的有效定界符。

has_header(sample)¶ 分析示例文本(假定为CSV格式),如果第一行很可能是一系列列标题,则返回True。

使用Sniffer的示例: withopen('example.csv',newline='')ascsvfile: dialect=csv.Sniffer().sniff(csvfile.read(1024)) csvfile.seek(0) reader=csv.reader(csvfile,dialect) #...processCSVfilecontentshere... csv模块定义了以下常量: csv.QUOTE_ALL¶ 指示writer对象给所有字段加上引号。

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

csv.QUOTE_NONNUMERIC¶ 指示writer对象为所有非数字字段加上引号。

指示reader将所有未用引号引出的字段转换为float类型。

csv.QUOTE_NONE¶ 指示writer对象不使用引号引出字段。

当定界符出现在输出数据中时,其前面应该有转义符。

如果未设置转义符,则遇到任何需要转义的字符时,writer都会抛出Error异常。

指示reader不对引号字符进行特殊处理。

csv模块定义了以下异常: exceptioncsv.Error¶ 该异常可能由任何发生错误的函数抛出。

变种与格式参数¶ 为了更容易指定输入和输出记录的格式,特定的一组格式参数组合为一个dialect(变种)。

一个dialect是一个Dialect类的子类,它具有一组特定的方法和一个validate()方法。

创建reader或writer对象时,程序员可以将某个字符串或Dialect类的子类指定为dialect参数。

要想补充或覆盖dialect参数,程序员还可以单独指定某些格式参数,这些参数的名称与下面Dialect类定义的属性相同。

Dialect类支持以下属性: Dialect.delimiter¶ 一个用于分隔字段的单字符,默认为','。

Dialect.doublequote¶ 控制出现在字段中的引号字符本身应如何被引出。

当该属性为True时,双写引号字符。

如果该属性为False,则在引号字符的前面放置转义符。

默认值为True。

在输出时,如果doublequote是False,且转义符未指定,且在字段中发现引号字符时,会抛出Error异常。

Dialect.escapechar¶ 一个用于writer的单字符,用来在quoting设置为QUOTE_NONE的情况下转义定界符,在doublequote设置为False的情况下转义引号字符。

在读取时,escapechar去除了其后所跟字符的任何特殊含义。

该属性默认为None,表示禁用转义。

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

備註 reader经过硬编码,会识别'\r'或'\n'作为行尾,并忽略lineterminator。

未来可能会更改这一行为。

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

默认为'"'。

Dialect.quoting¶ 控制writer何时生成引号,以及reader何时识别引号。

该属性可以等于任何QUOTE_*常量(参见模块内容段落),默认为QUOTE_MINIMAL。

Dialect.skipinitialspace¶ 如果为True,则忽略定界符之后的空格。

默认值为False。

Dialect.strict¶ 如果为True,则在输入错误的CSV时抛出Error异常。

默认值为False。

Reader对象¶ Reader对象(DictReader实例和reader()函数返回的对象)具有以下公开方法: csvreader.__next__()¶ 返回reader的可迭代对象的下一行,返回值可能是列表(由reader()返回的对象)或字典(由DictReader返回的对象),解析是根据当前设置的变种进行的。

通常应该这样调用它:next(reader)。

Reader对象具有以下公开属性: csvreader.dialect¶ 变种描述,只读,供解析器使用。

csvreader.line_num¶ 源迭代器已经读取了的行数。

它与返回的记录数不同,因为记录可能跨越多行。

DictReader对象具有以下公开属性: csvreader.fieldnames¶ 字段名称。

如果在创建对象时未传入字段名称,则首次访问时或从文件中读取第一条记录时会初始化此属性。

Writer对象¶ Writer对象(DictWriter实例和writer()函数返回的对象)具有下面的公开方法。

对于Writer对象,行必须是(一组可迭代的)字符串或数字。

对于DictWriter对象,行必须是一个字典,这个字典将字段名映射为字符串或数字(数字要先经过str()转换类型)。

请注意,输出的复数会有括号包围。

这样其他程序读取CSV文件时可能会有一些问题(假设它们完全支持复数)。

csvwriter.writerow(row)¶ 将参数row写入writer的文件对象,并根据当前设置的变种进行格式化。

本方法的返回值就是底层文件对象write方法的返回值。

3.5版更變:开始支持任意类型的迭代器。

csvwriter.writerows(rows)¶ 将rows*(即能迭代出多个上述*row对象的迭代器)中的所有元素写入writer的文件对象,并根据当前设置的变种进行格式化。

Writer对象具有以下公开属性: csvwriter.dialect¶ 变种描述,只读,供writer使用。

DictWriter对象具有以下公开方法: DictWriter.writeheader()¶ 在writer的文件对象中,写入一行字段名称(字段名称在构造函数中指定),并根据当前设置的变种进行格式化。

本方法的返回值就是内部使用的csvwriter.writerow()方法的返回值。

3.2版新加入. 3.8版更變:现在writeheader()也返回其内部使用的csvwriter.writerow()方法的返回值。

例子¶ 读取CSV文件最简单的一个例子: importcsv withopen('some.csv',newline='')asf: reader=csv.reader(f) forrowinreader: print(row) 读取其他格式的文件: importcsv withopen('passwd',newline='')asf: reader=csv.reader(f,delimiter=':',quoting=csv.QUOTE_NONE) forrowinreader: print(row) 相应最简单的写入示例是: importcsv withopen('some.csv','w',newline='')asf: writer=csv.writer(f) writer.writerows(someiterable) 由于使用open()来读取CSV文件,因此默认情况下,将使用系统默认编码来解码文件并转换为unicode(请参阅locale.getpreferredencoding())。

要使用其他编码来解码文件,请使用open的encoding参数: importcsv withopen('some.csv',newline='',encoding='utf-8')asf: reader=csv.reader(f) forrowinreader: print(row) 这同样适用于写入非系统默认编码的内容:打开输出文件时,指定encoding参数。

注册一个新的变种: importcsv csv.register_dialect('unixpwd',delimiter=':',quoting=csv.QUOTE_NONE) withopen('passwd',newline='')asf: reader=csv.reader(f,'unixpwd') Reader的更高级用法——捕获并报告错误: importcsv,sys filename='some.csv' withopen(filename,newline='')asf: reader=csv.reader(f) try: forrowinreader: print(row) exceptcsv.Errorase: sys.exit('file{},line{}:{}'.format(filename,reader.line_num,e)) 尽管该模块不直接支持解析字符串,但仍可如下轻松完成: importcsv forrowincsv.reader(['one,two,three']): print(row) 註解 1(1,2) 如果没有指定newline='',则嵌入引号中的换行符将无法正确解析,并且在写入时,使用\r\n换行的平台会有多余的\r写入。

由于csv模块会执行自己的(通用)换行符处理,因此指定newline=''应该总是安全的。

目录 csv---CSV文件读写 模块内容 变种与格式参数 Reader对象 Writer对象 例子 上個主題 檔案格式 下個主題 configparser---配置文件解析器 本頁 提交Bug 顯示原始碼 瀏覽 索引 模組| 下一頁| 上一頁| Python» 3.8.14Documentation» Python標準函式庫(StandardLibrary)» 檔案格式» |



請為這篇文章評分?