中国工程建设监理网站,wordpress主题合并,公众号编辑器哪个好,生产类营销型网站csv文件完整操作总结
1.概述
csv 模块主要用于处理从电子数据表格Excel或数据库中导入到文本文件的数据#xff0c;通常简称为 comma-separated value #xff08;CSV#xff09;格式因为逗号用于分离每条记录的各个字段。
2.读写操作
2.1.测试数据
创建一个test.csv文…csv文件完整操作总结
1.概述
csv 模块主要用于处理从电子数据表格Excel或数据库中导入到文本文件的数据通常简称为 comma-separated value CSV格式因为逗号用于分离每条记录的各个字段。
2.读写操作
2.1.测试数据
创建一个test.csv文件复制下面内容到文件中
Title 1,Title 2,Title 3,Title 4
1,a,08/18/07,å
2,b,08/19/07,∫
3,c,08/20/07,ç2.2.读取
从 CSV 文件中读取数据可以使用 reader() 函数来创建一个读取对象。 这个读取对象顺序处理文件的每一行可以把它当成迭代器使用 例如
import csvwith open(test.csv, rt) as f:reader csv.reader(f)for row in reader:print(row)reader() 的第一个参数指源文本在这个例子中是一个文件但它可以是任何可迭代对象 StringIO 实例list 等。第二个参数是可选的可用于控制输入的数据如何被解析。
[Title 1, Title 2, Title 3, Title 4]
[1, a, 08/18/07, å]
[2, b, 08/19/07, ∫]
[3, c, 08/20/07, ç]2.3.写入
写入 CSV 文件和读取它们一样简单。使用 writer() 方法创建一个写入对象然后使用 writerow() 去输出每一行。
import csvunicode_chars å∫çwith open(testout.csv, wt) as f:writer csv.writer(f)writer.writerow((Title 1, Title 2, Title 3, Title 4))for i in range(3):row (i 1,chr(ord(a) i),08/{:02d}/07.format(i 1),unicode_chars[i],)writer.writerow(row)print(open(testout.csv, rt).read())这个例子的输出和上面读取的例子看起来有些不同是因为这里有的值没有加引号
Title 1,Title 2,Title 3,Title 4
1,a,08/01/07,å
2,b,08/02/07,∫
3,c,08/03/07,ç
2.4.引号
写入时默认的引用行为不同所以之前示例中的第二和第三个字段未被引用。 要添加引号请将 quoting 参数设置为其他引用模式。
writer csv.writer(f, quotingcsv.QUOTE_NONNUMERIC)在这个例子中 QUOTE_NONNUMERIC 会给所有字段值不是数字的值添加引号 Title 1,Title 2,Title 3,Title 4
1,a,08/01/07,å
2,b,08/02/07,∫
3,c,08/03/07,ç有四种不同的引用选项在 csv 模块中被定义为常量。
QUOTE_ALL 无论什么类型的字段都会被引用。QUOTE_MINIMAL这是默认的选项使用指定的字符引用各字段如果解析器被配置为相同的 dialect 和选项时可能会让解析器在解析时产生混淆。QUOTE_NONNUMERIC引用那些不是整数或浮点数的字段。当使用读取对象时如果输入的字段是没有引号的那么它们会被转换成浮点数。QUOTE_NONE对所有的输出内容都不加引用当使用读取对象时引用字符看作是包含在每个字段的值里但在正常情况下它们被当成定界符而被去掉。
3.编码风格
其实没有一个标准定义这类逗号分隔值的文件所以解析器需要很灵活通过很多参数去控制如何解析 csv 或给其写入数据。但这并不是每个参数在写入或读取 csv 时分别传入而是统一分组为一个 编码风格 对象。
3.1.查看编码风格
Dialect 类可以通过名字注册因此 csv 模块调用它时不必预先知道相关的参数设置。所有注册过的编码风格列表可以通过 list_dialects() 方法查看。
import csvprint(csv.list_dialects())标准库提供了三种编码风格分别为 excel excel-tabs 和 unix。 excel 编码风格用来处理默认来自 Microsoft Excel 格式的数据的同样可用于处理来自 LibreOffice 格式的。 unix 编码风格将所有字段通过双引号引用并用 \n 做为每条记录的分隔符。
[excel, excel-tab, unix]3.2.创建一个编码风格
如果不使用逗号分隔字段输入文件使用竖杠 | 新建一个testdata.pipes文件复制下面内容到文件中作为测试数据。
Title 1|Title 2|Title 3
1|first line
second line|08/18/07使用「竖杠」的编码风格可以像使用逗号一样读取文件
import csvcsv.register_dialect(pipes, delimiter|)with open(testdata.pipes, rt) as f:reader csv.reader(f, dialectpipes)for row in reader:print(row)运行结果
[Title 1, Title 2, Title 3]
[1, first line\nsecond line, 08/18/07]3.3.编码风格参数
编码风格指定解析或写入数据文件时使用的所有标记。下表列出了可以设定的属性从字段的分隔方式到用于转义标记的字符。
属性默认含义delimiter,字段分隔符单字符doublequoteTrue控制 quotechar 实例是否翻倍escapecharNone用于表示转义序列的字符lineterminator\r\n写入时用来换行的字符quotechar引用含特殊值字段的字符一个字符quotingQUOTE_MINIMAL控制前面表述的引用行为skipinitialspaceFalse是否在字段分隔符后忽略空格
这段程序演示了当使用几种不同的编码风格格式化时相同的数据如何展示。
import csv
import syscsv.register_dialect(escaped,escapechar\\,doublequoteFalse,quotingcsv.QUOTE_NONE,)
csv.register_dialect(singlequote,quotechar,quotingcsv.QUOTE_ALL,)quoting_modes {getattr(csv, n): nfor n in dir(csv)if n.startswith(QUOTE_)
}TEMPLATE \
Dialect: {name}delimiter {dl!r:6} skipinitialspace {si!r}doublequote {dq!r:6} quoting {qu}quotechar {qc!r:6} lineterminator {lt!r}escapechar {ec!r:6}
for name in sorted(csv.list_dialects()):dialect csv.get_dialect(name)print(TEMPLATE.format(namename,dldialect.delimiter,sidialect.skipinitialspace,dqdialect.doublequote,ququoting_modes[dialect.quoting],qcdialect.quotechar,ltdialect.lineterminator,ecdialect.escapechar,))writer csv.writer(sys.stdout, dialectdialect)writer.writerow((col1, 1, 10/01/2010,Special chars: \ {} to parse.format(dialect.delimiter)))print()运行结果 Dialect: escapeddelimiter , skipinitialspace 0doublequote 0 quoting QUOTE_NONEquotechar lineterminator \r\nescapechar \\col1,1,10/01/2010,Special chars: \ \, to parseDialect: exceldelimiter , skipinitialspace 0doublequote 1 quoting QUOTE_MINIMALquotechar lineterminator \r\nescapechar Nonecol1,1,10/01/2010,Special chars: , to parseDialect: excel-tabdelimiter \t skipinitialspace 0doublequote 1 quoting QUOTE_MINIMALquotechar lineterminator \r\nescapechar Nonecol1 1 10/01/2010 Special chars: to parseDialect: singlequotedelimiter , skipinitialspace 0doublequote 1 quoting QUOTE_ALLquotechar lineterminator \r\nescapechar Nonecol1,1,10/01/2010,Special chars: , to parseDialect: unixdelimiter , skipinitialspace 0doublequote 1 quoting QUOTE_ALLquotechar lineterminator \nescapechar Nonecol1,1,10/01/2010,Special chars: , to parse3.4.自动检测编码风格
配置一个输入文件的编码风格的最好的办法是提前知道哪种编码风格是正确的。对于那些编码风格未知的参数 Sniffer 类可用于做有效的猜测。 sniff() 方法会获取输入数据的一个样本和一个可选参数给出可能的分隔符。
import csv
from io import StringIO
import textwrapcsv.register_dialect(escaped,escapechar\\,doublequoteFalse,quotingcsv.QUOTE_NONE)
csv.register_dialect(singlequote,quotechar,quotingcsv.QUOTE_ALL)# 为所有已知的编码风格生成样本数据
samples []
for name in sorted(csv.list_dialects()):buffer StringIO()dialect csv.get_dialect(name)writer csv.writer(buffer, dialectdialect)writer.writerow((col1, 1, 10/01/2010,Special chars \ {} to parse.format(dialect.delimiter)))samples.append((name, dialect, buffer.getvalue()))# 猜测样本的编码风格然后用猜测结果来解析数据。
sniffer csv.Sniffer()
for name, expected, sample in samples:print(Dialect: {}.format(name))print(In: {}.format(sample.rstrip()))dialect sniffer.sniff(sample, delimiters,\t)reader csv.reader(StringIO(sample), dialectdialect)print(Parsed:\n {}\n.format(\n .join(repr(r) for r in next(reader))))sniff() 方法返回一个包含了解析数据的参数的 Dialect 实例。结果并不一定是正确的例如这个例子中的「escaped」。
python3 csv_dialect_sniffer.pyDialect: escaped
In: col1,1,10/01/2010,Special chars \ \, to parse
Parsed:col1110/01/2010Special chars \\ \ \\ to parseDialect: excel
In: col1,1,10/01/2010,Special chars , to parse
Parsed:col1110/01/2010Special chars \ , to parseDialect: excel-tab
In: col1 1 10/01/2010 Special chars to parse
Parsed:col1110/01/2010Special chars \ \t to parseDialect: singlequote
In: col1,1,10/01/2010,Special chars , to parse
Parsed:col1110/01/2010Special chars \ , to parseDialect: unix
In: col1,1,10/01/2010,Special chars , to parse
Parsed:col1110/01/2010Special chars \ , to parse