Python CSV:如何在Python中读取和写入CSV文件

Python CSV:如何在Python中读取和写入CSV文件

Python CSV 模块允许你将数据存储为 CSV(逗号分隔值)文件。虽然许多应用程序使用数据库,但有时使用 CSV 文件可能会更好,例如当你为另一个需要这种格式的应用程序生成数据时。

在本文中,你将学习如何使用 Python 以两种不同的方式读取和写入 CSV 文件中的数据:使用 Python CSV 模块和使用第三方 Pandas 库。

什么是 .csv 文件?

CSV 文件是用于存储表格数据的纯文本文件。因为它是纯文本,你可以在文本编辑器中打开 CSV 文件进行编辑。你还可以在 Microsoft Excel 和其他电子表格应用程序中打开 CSV 文件,以查看以表格格式显示的数据。以下是示例 CSV 文件的内容:

姓名,省份,城市,出生日期
张三,安徽省,合肥市,1990年1月25日
赵四,广东省,广州市,1991年3月15日
王五,湖北省,武汉市,1992年4月8日

以下是你在 Excel 中打开此文件时的外观:

Python CSV:如何在Python中读取和写入CSV文件

请注意,换行符分隔每个数据集,第一行包含每列的标题。然后用逗号分隔每一行的数据。在标准 CSV 格式中,分隔每个值的字符(也称为分隔符)是逗号。

但并非所有 CSV 文件都使用逗号作为分隔符。有时会使用制表符、分号或冒号,尤其是在数据中有逗号的情况下。数据值也可以用单引号或双引号括起来,这允许你在数据值本身中使用逗号。

"one,one", "two,two", "three,three"

所有类型的应用程序都可以使用 CSV 文件(包括电子表格和数据库)来获取数据并将数据从一个应用程序传输到另一个应用程序。由于它们是纯文本文件,任何具有文本处理能力的编程语言都可以处理它们。

使用 Python CSV 处理 CSV 文件

Python 编程语言附带一个 CSV 模块,该模块允许在不安装第三方库的情况下读取和写入 CSV 文件。默认情况下,它旨在处理 Microsoft Excel 生成的 CSV 文件格式,但它可以配置为读取和写入任何类型的 CSV 文件。

使用 CSV 模块读取 CSV 文件

要解析 CSV 数据,你可以使用 CSV 模块的阅读器对象。假设我们在名为 names.csv 的文件中有第一个 CSV 示例,其中包含名称、城市、州和生日月份值。

这是我们可以用来解析文件的Python 代码示例:

# 导入CSV模块
import csv
with open('name.csv') as csv_file:
    # 创建一个 CSV Reader 对象
    reader = csv.reader(csv_file)
    # 设置行数所以我们知道哪一行的标题
    line_count = 0
    for row in reader:
        # 从文件的第一行打印出标题
        if line_count == 0:
            print(f'列标题是: {", ".join(row)}')
            line_count += 1
        # 从剩余的行中打印出数据
        else:
            print(f'{row[0]},住在 {row[1]},{row[2]}, 出生日期是 {row[3]}。')
            line_count += 1
    print(f'CSV文件一共有 {line_count} 行')

当这个 Python 脚本运行时,它会打印出来:

列标题是: 姓名, 省份, 城市, 出生日期
张三,住在 安徽省,合肥市, 出生日期是 1990年1月25日。
赵四,住在 广东省,广州市, 出生日期是 1991年3月15日。
王五,住在 湖北省,武汉市, 出生日期是 1992年4月8日。
CSV文件一共有 4 行

reader 对象返回行,它是字符串项的列表,并且由于第一行包含每列数据的标题,因此它的处理方式不同。示例代码中的注释更详细地解释了正在发生的事情。

使用 CSV 模块将 CSV 文件读入字典

我们用于解析 CSV 文件的最后一种方法有效,但它需要处理字符串列表。解析 CSV 的一种更简洁的方法是将数据读入 Python 字典。

我们将使用我们在上一个脚本中处理的相同 CSV 数据,但这次将使用 CSV 模块的 DictReader 对象。这是代码:

# 导入 csv 模块
import csv
with open('name.csv') as csv_file:
    # 创建一个 CSV DictReader 对象
    reader = csv.DictReader(csv_file)
    # 使用 reader.fieldnames 获取标题
    print(f'列标题是:{", ".join(reader.fieldnames)}')
    # 设置一个行计数器
    line_count = 0
    for row in reader:
        print(f"{row['姓名']},住在 {row['省份']},{row['城市']}, 出生日期是 {row['出生日期']}。")
        line_count += 1
    print(f'CSV文件一共有 {line_count} 行')

这将打印出与最后一个代码相同的结果:

列标题是:姓名, 省份, 城市, 出生日期
张三,住在 安徽省,合肥市, 出生日期是 1990年1月25日。
赵四,住在 广东省,广州市, 出生日期是 1991年3月15日。
王五,住在 湖北省,武汉市, 出生日期是 1992年4月8日。
CSV文件一共有 3 行

但是当你使用 DictReader 方法时,它会自动解析标题以创建字典。因此,我们必须使用 DictReader 对象的 fieldnames 属性,而不是打印第一行来获取标题。

当我们访问每一行中的值时,我们现在可以通过标题名称而不是数字索引来访问它们。另外,请注意 DictReader 仅迭代数据行,而不是标题行。

使用 Python CSV 读取自定义 CSV 文件

我们当前使用的 CSV 文件具有 Python CSV 模块所期望的标准 CSV 格式,因此我们只需将文件传递给 reader 对象,它就可以工作。

但是,如果你的 CSV 文件使用不同的分隔符、将数据用引号括起来或使用转义字符,则必须向读取器或 DictReader 方法调用添加额外参数才能正确处理文件。

如果我们有一个使用制表符分隔符(通常称为 TSV 文件)的 CSV 文件,将值用双引号括起来,并使用反斜杠作为转义字符,我们将不得不像这样设置这些额外的参数:

# 使用 reader
with open('names.csv') as csv_file:
    reader = csv.reader(csv_file, delimiter='\t', quotechar='"', escapechar='\\')
# 使用 DictReader
with open('names.csv') as csv_file:
    reader = csv.DictReader(csv_file, delimiter='\t', quotechar='"', escapechar='\\')

使用 Python CSV 编写 CSV 文件

要使用 Python CSV 模块将数据写入 CSV 文件,你可以使用写入器对象之一:writer 或 DictWriter。我们将从使用 writer 开始,它使用 Python 列表来创建 CSV 文件的行。

writer 方法也接受与 reader 方法相同的参数:delimiter、quotechar 和 escapechar。这允许你生成你选择的任何 CSV 格式。它还接受一个引用参数,我们可以在下面的示例中看到它的作用:

# 使用 Python open 方法打开文件进行写入,
with open('example.csv', mode='w') as example_file:
    writer = csv.writer(example_file, delimiter=',', quotechar='"', quoting =csv.QUOTE_MINIMAL)
    # 用 writerow 方法写入表头行
    writer.writerow(['姓名', '省份', '城市', '出生日期'])
    # 用 writerow 方法写入数据行
    writer.writerow( ['张三', '安徽省', '合肥市', '1990年1月25日'])
    writer.writerow(['赵四', '广东省', '广州市', '1991年3月15日'])
    writer.writerow(['王五', '湖北省', '武汉市', '1992年4月8日'])

上面的代码将生成一个看起来与我们一直在使用的文件相同的文件。尽管我们将 quotechar 设置为双引号,但其中没有引号。

这是因为引用参数设置为 csv.QUOTE_MINIMAL。这个参数告诉作者如何使用引号,并且有四个可能的值:

  • csv.QUOTE_MINIMAL。这是默认设置,仅当字段包含分隔符或引号字符时,编写器才会应用引号。
  • csv.QUOTE_ALL。作者将对每个字段应用引号。
  • csv.QUOTE_NONNUMERIC。作者将引用所有文本字段并将任何数字数据转换为浮点数据类型。
  • csv.QUOTE_NONE。作者将转义分隔符而不是使用引号。如果使用此值,则需要一个 escapechar 参数。

使用 CSV 将 CSV 文件写入字典

就像我们可以使用 DictReader 方法而不是 reader 方法来为我们的数据使用字典一样,我们可以使用 DictWriter 方法而不是 writer 方法。这是一个编写相同 CSV 文件的示例:

# 导入 csv 模块
import csv
# 用 Python open 方法打开要写入的文件
with open('example.csv', mode='w') as example_file:
    # 标题列表
    fieldnames = ['姓名', '省份', '城市', '出生日期']
    # 创建 DictWriter 对象
    writer = csv.DictWriter(example_file, fieldnames=fieldnames, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    # 写入表头row with writeheader 方法
    writer.writeheader()
    # 使用 writerow 方法写入数据行
    writer.writerow({'姓名': '张三', '省份': '安徽省', '城市': '合肥市', '出生日期': '1990年1月25日'})
    writer.writerow({'姓名': '李四', '省份': '广东省', '城市': '广州市', '出生日期': '1991年3月15日'})
    writer.writerow({'姓名': '王五', '省份': '湖北省', '城市': '武汉市', '出生日期': '1992年4月8日'})

DictWriter 方法接受 writer 方法所做的所有参数,但它还有另一个必需参数:fieldnames。此参数是 CSV 文件中标题名称的列表,也是你将用于创建数据行的字典中的键。要打印标题行,我们调用 writeheader 方法,而不是像使用 writer 方法那样手动创建行。

使用 pandas 处理 CSV 文件

更高级的 CSV 文件处理的另一个选项是使用Python pandas 模块。该模块为表格数据提供高级分析和操作功能,通常与机器学习、数据分析和数据可视化库结合使用。它也是开源且免费使用的,但你必须使用 Python 包管理器单独安装它。如果你使用的是 pip,则可以使用以下命令安装它:

pip install pandas

如果你使用的是Anaconda,你可以通过运行以下命令来安装它:

conda install pandas

用 pandas 读取 CSV 文件

使用 pandas 读取 CSV 文件非常简单。只需确保安装了 pandas 模块,导入模块,在文件上调用 pandas read_csv 方法,然后打印结果。你不必使用 Python open 方法或遍历文件中的行。这一切都为你完成了。这是一个例子:

# 导入 pandas 模块
import pandas
# 将 csv 文件读入 DataFrame
dataframe = pandas.read_csv('names.csv')
print(dataframe)

结果如下:

   姓名   省份   城市        出生日期
0  张三  安徽省  合肥市  1990年1月25日
1  赵四  广东省  广州市  1991年3月15日
2  王五  湖北省  武汉市   1992年4月8日

当 pandas 读取 CSV 文件时,它会将数据放入数据框中。数据框是一种二维标记的数据结构,有点像内存中的电子表格或数据库。要了解有关pandas的更多信息,请查看我们 使用Pandas 和 Python 进行数据分析的课程。

用 pandas 编写 CSV 文件

你还可以从数据框在 pandas 中创建 CSV 文件。这是一个例子:

# 导入 pandas 模块
import pandas
# 创建一个数据
dataframe = pandas.DataFrame([
 ['张三', '安徽省', '合肥市', '1990年1月25日'],
 ['赵四', '广东省', '广州市', '1991年3月15日'],
 ['王五', '湖北省', '武汉市', '1992年4月8日']],
 columns=['姓名', '省份', '城市', '出生日期'])
# 写数据帧到 CSV 文件
dataframe.to_csv('example.csv', index=False)

此代码将重新创建我们在整篇文章中使用的相同 CSV。pandas.DataFrame 中的第一个参数包含我们要作为列表列表写入 CSV 的数据。每个嵌套列表都将成为一个数据行。通过设置命名列参数,我们定义了数据框中的列,这些列将成为 CSV 文件的标题。

然后我们在我们创建的数据帧上调用 to_csv 方法来生成 CSV 文件。第一个参数是我们要创建的文件的路径,设置为 false 的命名索引参数告诉 pandas 不包含它为数据帧创建的索引。

如果没有这个,我们的 CSV 文件的第一列将有一个空标题和每行的索引号。

结论

CSV 文件格式是一种方便的通用格式,用于将数据从一个应用程序传输到另一个应用程序。你只需在 Excel 或文本编辑器中打开文件即可检查你正在使用的数据,而无需使用专有应用程序。

如果你想用 Python 简单地读写 CSV 文件,该功能是内置的并且易于使用。但是,如果你打算进行数据分析,Python pandas 模块可能是最佳选择,因为它具有所有数据操作功能。如果你准备好使用 Python 构建实际技能,我们的Python 课程将帮助你构建它们。

如果本站的内容对你有帮助,可以点击这儿,不花一分钱捐赠本站

(0)
疯狂的小黑的头像疯狂的小黑
上一篇 2022年7月13日 下午9:00
下一篇 2022年7月15日 下午9:55

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

微信