python基础 - csv文件格式
csv(Comma Separated Values)格式是最通用的电子表格和数据库的导入导出格式,csv模块可以用来处理带分隔符的数据文件,是Python“功能齐备”理念的完美案例。csv模块中的reader和writer对象用来读写序列,也可以使用DictReader和DictWriter类在字典中读写数据。
- csv模块中定义的函数
csv.reader(csvfile, dialect=‘excel’, **fmtparams)
返回一个可以遍历csv文件的reader对象。dialect参数可以用于定义一组特定的csv方言参数,是Dialect类的子类或者list_dialects()函数返回的字符串。从csv文件读取的每一行都作为字符串列表返回。除非指定了QUOTE_NONNUMERIC格式选项(在这种情况下,未加引号的字段将转换为浮点数),否则不会执行自动的数据类型转换。
-
Reader对象
Reader对象包括DictReader实例和通过reader()函数获得的对象有以下通用方法:
csvreader.__next__()
:将读取器可迭代对象的下一行作为列表返回,根据当前方言进行解析。通常调用next(reader)。
Reader对象有以下通用属性:
csvreader.dialect
:当前解析器使用的方言;
csvreader.line_num
:从源迭代器读取的行数。这与返回的记录数不同,因为记录可以跨越多行。
csvreader.fieldnames
:如果在创建对象时没有作为参数传递,则在第一次访问或从文件中读取第一个记录时初始化此属性。
- Writer对象
Writer对象包括DictWriter实例和writer()方法获得的对象有以下通用方法,对于Writer对象,一行必须是一个字符串或数字的可迭代对象,对于DictWriter对象,一行必须是一个将字段名映射到字符串或数字的字典。注意复数是用括号括起来的。
csvwriter.writerow(row)
:将row参数写入写入器的文件对象,根据当前方言进行格式化。
csvwriter.writerows(rows)
:将所有的行参数写入写入器的文件对象,并根据当前方言进行格式化。
-
方言和格式化参数
Dialects支持以下属性:
Dialect.delimiter
:一个用来分隔字段的单字符字符串,默认是逗号。
Dialect.doublequote
:控制引号在字段中出现的实例本身如何被引用。
Dialect.escapechar
:如果引号设置为QUOTE_NONE,则用于转义分隔符;如果双引号设置为False,则用于转义quotechar。
Dialect_quotechar
:一个字符串,用于引用包含特殊字符的字段,如分隔符或引号,或包含换行字符。默认为“”。
- 案例
(1)读取一个csv文件
import csv
with open('demo.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 读取csv使用可选的格式,使用默认的utf-8编码
with open('passwd', newline='', encoding='utf-8') as f:
reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
for row in reader:
print(row)
(2)数据写入csv文件
import csv
# 如果不指定newline='',嵌在引号字段中的换行符将无法被正确解释,并且在使用\r\n行结尾的平台上写入时会添加额外的\r。
with open('demo.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(['one, two, three'])
(3)注册新的方言
import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='') as f:
reader = csv.reader(f, 'unixpwd')
(4)捕获错误
import csv, sys
filename = 'demo.csv'
with open(filename, newline='') as f:
reader = csv.reader(f)
try:
for row in reader:
print(row)
except csv.Error as e:
sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e))