返回介绍

第14单元 处理 CSV 文件

发布于 2024-01-28 22:01:16 字数 1959 浏览 0 评论 0 收藏 0

CSV是一种结构化文本文件格式,用于存储和转移表格(或形式接近表格的)数据。该格式可以追溯到1972年,那时它是Microsoft Excel、Apache OpenOffice Calc和其他电子表格软件的首选格式。Data.gov1是一个提供公开数据的美国政府网站,该网站中CSV格式的数据集就有12 550个2

1catalog.data.gov/dataset?res_format=CSV

2翻译此书时该值为14 234。——译者注

一个CSV文件由表示变量的列和表示记录的行组成(具有统计背景的数据科学家通常称这些记录为观测值)。记录中的字段通常由逗号分隔,但其他分隔符也是比较常见的,例如制表符(制表符分隔值,TSV)、冒号、分号和竖直条等。建议在自己创建的文件中坚持使用逗号作为分隔符,同时保证编写的处理程序能正确处理使用其他分隔符的CSV文件。

值得注意的是,有时看起来像分隔符的字符并不是分隔符。通过将字段包含在引号字符中,可确保字段中的类分隔符字符作为变量值的一部分(如...,"Hello, world",...)。

为了使用方便,Python的csv模块提供了一个CSV读取器和一个CSV写入器。两个对象的第一个参数都是已打开的文本文件句柄(在下面的示例中,使用newline=''选项打开文件,从而避免删除行的操作)。必要时可以通过可选参数delimiter和quotechar,提供默认的分隔符和引号字符。Python还提供了控制转义字符、行终止符等定界符的可选参数。

with open("somefile.csv", newline='') as infile:
  reader = csv.reader(infile, delimiter=',', quotechar='"')

CSV文件的第一条记录通常包含列标题,可能与文件的其余部分有所不同。这只是一个常见的做法,并非CSV格式本身的特性。

CSV读取器提供了一个可以在for循环中使用的迭代器接口。迭代器将下一条记录作为一个字符串字段列表返回。读取器不会将字段转换为任何数值数据类型(必要时需要自己处理!),另外,除非传递可选参数skipinitialspace=True,否则不会删除前导的空白。

如果事先不知道CSV文件的大小,而且文件可能很大,则不宜一次性读取所有记录,而应使用增量的、迭代的、逐行的处理方式:读出一行,处理一行,再获取另一行。

CSV写入器提供writerow()和writerows()两个函数。writerow()将一个字符串或数字序列作为一条记录写入文件。该函数将数字转换成字符串,因此不必担心数值表示的问题。类似地,writerows()将字符串或数字序列的列表作为记录集写入文件。

在下面的示例中,使用csv模块从CSV文件中提取Answer.Age列。假设此列肯定存在,但列的索引未知。一旦获得数值,借助statistics模块就能得到年龄的平均值和标准偏差。

首先,打开文件并读取数据:

with open("demographics.csv", newline='') as infile:
  data = list(csv.reader(infile))

检查文件中的第一个记录 data[0] ,它必须包含感兴趣的列标题:

ageIndex = data[0].index("Answer.Age")

最后,访问剩余记录中感兴趣的字段,并计算和显示统计数据:

ages = [int(row[ageIndex]) for row in data[1:]]
print(statistics.mean(ages), statistics.stdev(ages))

csv和statistics模块是底层的、快速而粗糙的工具。在第6章,你将了解如何在更为复杂的项目中使用pandas的数据frame,完成那些比对几列数据进行琐碎的检索要高端得多的任务。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文