零基础也能看懂的python内置csv模块教程
这篇博客就为你介绍一个知识点,python 内置模块 csv 。让大家一文就看懂csv csv(Comma-Separated Values)文件是什么?以及python 中的 csv 文件清晰解法读取文件写入文件 csv 文件其它说明
目录
csv(Comma-Separated Values)文件是什么?
python 中的 csv 文件清晰解法
读取文件
写入文件
csv 文件其它说明
csv(Comma-Separated Values)文件是什么?
它是一种文件格式,一般也被叫做逗号分隔值文件,可以使用 Excel 软件或者文本文档打开 。
其中数据字段用半角逗号间隔(也可以使用其它字符),使用 Excel 打开时,逗号会被转换为分隔符。
csv 文件是以纯文本形式存储了表格数据,并且在兼容各个操作系统。
例如下面的文本,在 excel 中就以表格的形式存在。
sid,name,age
10010,橡皮擦,18
10086,发量迷人的乔喻,19
10000,各位博主,20
下面就对 python 内置模块 csv 的用法进行简单的说明。
python 中的 csv 文件清晰解法
读取文件
使用 csv.reader()
读取 csv 文件内容。
1 2 3 4 5 6 7 | import csv # 模块导入 with open ( 'aa.csv' , 'r' , newline = ' ', encoding=' utf - 8 ') as f: # <_csv.reader object at 0x00000000020918D0> reader = csv.reader(f) for r in reader: print (r) |
其中 csv.reader()
方法的原型如下所示:
1 | csv.reader(csvfile, dialect = 'excel' , * * fmtparams) |
其中的参数 csvfile
可以是任何对象,但要求该对象是一个迭代器,所以文件对象和列表对象都可以传入,如果是文件对象,还要求打开它时携带参数 newline=''
。后面的参数保持默认即可。
第二种方式是使用 DictReader
类,该类实现的效果与 reader()
方法一致,也是接收可迭代对象,返回生成器,差异是将返回的结果放到了一个字典的值内,字典的键就是单元格的标题。并且这样输出的函数是,不需要单独处理 csv 的列头行了。
1 2 3 4 5 | import csv # 模块导入 with open ( 'aa.csv' , 'r' , newline = ' ', encoding=' utf - 8 ') as f: reader = csv.DictReader(f) for r in reader: print (r) |
输出内容:
1 2 3 | OrderedDict([( 'sid' , '10010' ), ( 'name' , '橡皮擦' ), ( 'age' , '18' )]) OrderedDict([( 'sid' , '10086' ), ( 'name' , '发量迷人的乔喻' ), ( 'age' , '19' )]) OrderedDict([( 'sid' , '10000' ), ( 'name' , '各位博主' ), ( 'age' , '20' )]) |
写入文件
csv 文件写入用到的模块方法是 csv.writer()
,该方法的原型如下:
1 | csv.writer(csvfile, dialect = 'excel' , * * fmtparams) |
最基本的写入:
1 2 3 4 5 6 7 | import csv with open ( 'abc.csv' , 'w' , newline = '') as csvfile: w = csv.writer(csvfile) # 写入列头 w.writerow([ "sid" , "name" , "age" ]) w.writerow([ "10010" , "橡皮擦" , "18" ]) w.writerow([ "10086" , "发量迷人的乔喻" , "18" ]) |
这时如果你在打开文件时,缺少了 newline=''
,那写入 csv 文件内容之后,会出现多余的换行。
除此之外,我们写入 csv 文件的时候,可以启用 dialect
(方言)参数。例如使用 |
作为列的分隔符。
此时的文件写入代码写成下述内容:
1 2 3 4 5 6 7 8 9 10 11 | class my_dialect(csv.Dialect): lineterminator = '\r\n' delimiter = ';' quotechar = '"' quoting = csv.QUOTE_MINIMAL with open ( 'abc.csv' , 'w' , newline = '') as csvfile: w = csv.writer(csvfile, dialect = my_dialect) # 写入列头 w.writerow([ "sid" , "name" , "age" ]) w.writerow([ "10010" , "橡皮擦" , "18" ]) w.writerow([ "10086" , "发量迷人的乔喻" , "18" ]) |
上述代码定义了一个新的类 my_dialect
,并使其继承 csv.Dialect
类,重写了其中的部分字段。
delimiter
:分隔字符,默认为 ,
;
lineterminator
:writer 方法写入数据时,每行的结尾字符,默认为 \r\n
;
quotechar
:单字符,用于包裹具有特殊字符的字段,例如 定界符,引号字符,换行符,默认是 "
;
quoting
:控制 writer 何时生成引号,以及 reader 何时识别引号,默认是 QUOTE_MINIMAL
,其余几个值分别是
QUOTE_ALL(全部加引号),
QUOTE_MINIMAL(特定情况加),
QUOTE_NONNUMERIC(所有非数字加),
QUOTE_NONE(都不加);
Writer
对象的方法说明:
csvwriter.writerow(row)
:写入单行;
csvwriter.writerows(rows)
:写入多行
1 2 3 4 5 6 7 8 9 10 11 | import csv # 模块导入 csv_headers = [ 'name' , 'age' ] rows = [( '橡皮擦' , 18 ), ( '发量迷人的乔喻' , 19 ), ( '各位博主' , 20 )] with open ( './aa.csv' , 'w' , encoding = 'utf-8' ,newline = '') as f: csv_file = csv.writer(f) csv_file.writerow(csv_headers) # 写入头 csv_file.writerows(rows) |
与 DictReader
类使用方法差不多,还存在一个 DictWriter
类,该类将以字段格式写入 csv
文件字段。
1 2 3 4 5 6 7 8 | import csv with open ( 'abc.csv' , 'w' , newline = '') as csvfile: w = csv.DictWriter(csvfile, fieldnames = [ 'sid' , 'name' , 'age' ]) w.writeheader() # 写入列头 w.writerow({ 'sid' : '10010' , 'name' : '橡皮擦' , 'age' : 18 }) w.writerow({ 'sid' : '10010' , 'name' : '橡皮擦' , 'age' : 18 }) w.writerow({ 'sid' : '10010' , 'name' : '橡皮擦' , 'age' : 18 }) |
上述代码尤其注意 fieldnames
参数是必填参数,表示的是列头,并且在写入正式数据前,需使用 w.writeheader()
写入列头。
csv 文件其它说明
关于 csv 方言,可以使用 csv.register_dialect
方法将 name
与 dialect
关联起来,核心含义相当于给 dialect
起了一个别名。删除也比较简单,使用 csv.unregister_dialect(name)
即可。csv.list_dialects()
返回已经注册的方言名称,你可以在电脑上做一下测试,查看 Python 环境中提供的几种方言。
1 2 3 4 5 6 7 8 9 | import csv csv.register_dialect( 'ca' , delimiter = '|' , quoting = csv.QUOTE_MINIMAL) with open ( 'abc.csv' , 'w' , newline = '') as csvfile: w = csv.DictWriter(csvfile, fieldnames = [ 'sid' , 'name' , 'age' ], dialect = 'ca' ) w.writeheader() # 写入列头 w.writerow({ 'sid' : '10010' , 'name' : '橡皮擦' , 'age' : 18 }) w.writerow({ 'sid' : '10010' , 'name' : '橡皮擦' , 'age' : 18 }) w.writerow({ 'sid' : '10010' , 'name' : '橡皮擦' , 'age' : 18 }) |
csv 模块还提供了 csv.Sniffer
类,用于推断 csv 文件的格式,其存在两个方法:
sniff(sample, delimiters=None):分析并返回一个 dialect 子类,可以分析出格式参数;
has_header(sample):分析 csv 文件是否存在标题。
以上就是零基础也能看懂的python内置csv模块详解的详细内容
原文链接:https://blog.csdn.net/hihell/article/details/121250076