没基础,也可一文看懂 python 中的 csv 模块

举报
梦想橡皮擦 发表于 2021/12/21 08:02:54 2021/12/21
【摘要】 这篇博客就为你介绍一个知识点,python 内置模块 csv 。 csv(Comma-Separated Values)文件是什么?它是一种文件格式,一般也被叫做逗号分隔值文件,可以使用 Excel 软件或者文本文档打开 。其中数据字段用半角逗号间隔(也可以使用其它字符),使用 Excel 打开时,逗号会被转换为分隔符。csv 文件是以纯文本形式存储了表格数据,并且在兼容各个操作系统。例如下...

这篇博客就为你介绍一个知识点,python 内置模块 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 文件内容。

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() 方法的原型如下所示:

csv.reader(csvfile, dialect='excel', **fmtparams)

其中的参数 csvfile 可以是任何对象,但要求该对象是一个迭代器,所以文件对象和列表对象都可以传入,如果是文件对象,还要求打开它时携带参数 newline='' 。后面的参数保持默认即可。

第二种方式是使用 DictReader 类,该类实现的效果与 reader() 方法一致,也是接收可迭代对象,返回生成器,差异是将返回的结果放到了一个字典的值内,字典的键就是单元格的标题。并且这样输出的函数是,不需要单独处理 csv 的列头行了。

import csv  # 模块导入

with open('aa.csv', 'r', newline='', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for r in reader:
        print(r)

输出内容:

OrderedDict([('sid', '10010'), ('name', '橡皮擦'), ('age', '18')])
OrderedDict([('sid', '10086'), ('name', '发量迷人的乔喻'), ('age', '19')])
OrderedDict([('sid', '10000'), ('name', '各位博主'), ('age', '20')])

写入文件

csv 文件写入用到的模块方法是 csv.writer(),该方法的原型如下:

csv.writer(csvfile, dialect='excel', **fmtparams)

最基本的写入:

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(方言)参数。例如使用 | 作为列的分隔符。
此时的文件写入代码写成下述内容:

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:分隔字符,默认为 ,
  • lineterminatorwriter 方法写入数据时,每行的结尾字符,默认为 \r\n
  • quotechar:单字符,用于包裹具有特殊字符的字段,例如 定界符引号字符换行符,默认是 "
  • quoting:控制 writer 何时生成引号,以及 reader 何时识别引号,默认是 QUOTE_MINIMAL,其余几个值分别是 QUOTE_ALL(全部加引号)QUOTE_MINIMAL(特定情况加)QUOTE_NONNUMERIC(所有非数字加)QUOTE_NONE(都不加)

Writer 对象的方法说明:

  • csvwriter.writerow(row):写入单行;
  • csvwriter.writerows(rows):写入多行
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 文件字段。

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 方法将 namedialect 关联起来,核心含义相当于给 dialect 起了一个别名。删除也比较简单,使用 csv.unregister_dialect(name) 即可。csv.list_dialects() 返回已经注册的方言名称,你可以在电脑上做一下测试,查看 Python 环境中提供的几种方言。

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 文件是否存在标题。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。