Python 写入 CSV 文件

在 Python 中,如果想要写入 CSV 文件,同样可以使用以下 2 种方式来实现。

  • 使用 csv 模块。
  • 使用 pandas 库。

使用 csv 模块写入 CSV 文件

在 Python 中,我们可以使用 csv 模块的 writer() 函数来将数据写入一个 CSV 文件。

语法:

import csv

with open(路径, 'w', encoding='utf-8') as f:
    writer = csv.writer(f)
    ……

说明:

想要往 CSV 文件写入数据,首先也是需要使用 open() 函数来打开这个文件,注意此时使用的是 'w' 模式。如果想要以 “追加” 的方式写入,应该使用 'a' 模式。打开文件之后,接着使用 csv 模块的 writer() 函数来写入数据。

首先整理一下项目结构,当前项目下有一个 data 文件夹,整个项目的结构如下图所示。

Python CSV 项目结构 1

示例 1:以覆盖的方式写入 CSV 文件

import csv

with open('data/fruits.csv', 'w', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow([1, '葡萄', '浆果', '夏', 27.3])
    writer.writerow([2, '柿子', '浆果', '秋', 6.4])
    writer.writerow([3, '橘子', '浆果', '秋', 11.9])
    writer.writerow([4, '山竹', '仁果', '夏', 40.0])
    writer.writerow([5, '苹果', '仁果', '秋', 12.6])

运行代码之后,我们可以发现 data 文件夹中多了一个 fruits.csv 文件,如下图 1 所示。fruits.csv 文件内容如图 2 所示。

以覆盖的方式写入 CSV 文件

有问题的 CSV 文件

分析:

数据倒是添加进去了,却多了很多空行,这是怎么回事呢?想要解决这个问题,需要在 open() 函数中添加 newline='' 这个参数。

with open('data/fruits.csv', 'w', encoding='utf-8', newline='') as f:

我们把 fruits.csv 重置成原来的数据,再次运行后的效果就是正常的了,如下图所示。

处理后的 CSV 文件

示例 2:以追加的方式写入 CSV 文件

import csv

with open('data/fruits.csv', 'a', encoding='utf-8', newline='') as f:
    writer = csv.writer(f)
    writer.writerow([6, '梨子', '仁果', '秋', 13.9])
    writer.writerow([7, '西瓜', '瓜果', '夏', 4.5])
    writer.writerow([8, '菠萝', '瓜果', '夏', 11.9])

运行之后,打开 fruits.csv 文件,可以看到数据已经添加进去了,如下图所示。

以追加的方式写入 CSV 文件

分析:

with open('data/fruits.csv', 'a', encoding='utf-8') as f:

上面的 'a' 表示以追加的方式来写入文件,此时是在文件原内容的末尾追加新内容。

之前反复强调 CSV 文件最后要有一个空行,如果没有这个空行,又会怎么样呢?我们重塑 fruits.csv 成如下图 1 所示,并且把最后的空行删除。然后再去执行上面例子的代码,结果如下图 2 所示。

末尾没有空行的 CSV 文件

与预期不符的 CSV 文件

如果没有这一个空行,那么下一次追加的内容就会紧贴在已有数据的后面,而不是另起一行显示数据,这样得到的就不是预期结果了。所以在使用 CSV 文件格式时,请一定要记得在最后加上一个空行。

如何一次性写入多行数据?

在上面的例子中,我们是一行一行地调用 writerow() 来写入数据的。如果数据量很大,我们可以把所有数据放在一个 “二维列表” 中,然后使用 writerows() 方法一次性全部写入,代码会更加简洁,比如:

import csv

# 将所有数据存放在一个二维列表中
data = [
    [1, '葡萄', '浆果', '夏', 27.3],
    [2, '柿子', '浆果', '秋', 6.4],
    [3, '橘子', '浆果', '秋', 11.9]
]

with open('data/fruits.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)

# 一次性批量写入多行数据
writer.writerows(data)

使用 pandas 库写入 CSV 文件

在 Python 中,我们还可以使用 pandas 库的 to_csv() 方法将数据导出到一个 CSV 文件。注意,to_csv() 是 DataFrame 对象的一个方法。

语法:

df.to_csv(path, index=布尔值 , header=布尔值)

说明:

to_csv() 方法接收以下 3 个参数。

  • path(必选):表示文件的路径。
  • index(可选):表示是否输出行名,默认值为 True(也就是会输出行名)。
  • header(可选):表示是否输出列名,默认值为 True(也就是会输出列名)。

小伙伴们特别清楚一点:上一节介绍的 read_csv() 是 Pandas 的一个函数,而 to_csv() 是 DataFrame 的一个方法。接下来,我们清空 data 这个文件夹,此时整个项目结构如下图所示。

Python CSV 项目结构 2

示例 3:pandas 写入 CSV

import pandas as pd

data = [
    [1,'葡萄', '浆果', '夏', 27.3],
    [2,'柿子', '浆果', '秋', 6.4],
    [3,'橘子', '浆果', '秋', 11.9],
    [4,'山竹', '仁果', '夏', 40.0],
    [5,'苹果', '仁果', '秋', 12.6],
]
df = pd.DataFrame(data, columns=['id', 'name', 'type', 'season', 'price'])
df.to_csv('data/fruits.csv')

运行代码之后,我们可以发现 data 文件夹中多了一个 fruits.csv 文件,如下图 1 所示。fruits.csv 文件内容如图 2 所示。

pandas 写入 CSV

包含行名的 CSV 文件

分析:

上面其实是把行名也写进来了,很多时候我们并不希望 CSV 文件有这种连续整数的行名,此时可以使用 index=False 这个参数,代码修改如下。

df.to_csv('data/fruits.csv', index=False)

再次运行代码之后,打开 fruits.csv,此时发现行名不见了,如下图所示。

不包含行名的 CSV 文件

提示: Pandas 是 Python 数据分析最重要的工具之一,想要更全面深入地了解它,可以学习我们即将上线的 Pandas 教程。

上一篇: Python 读取 CSV

下一篇: Python 读取 JSON

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号