python 读写 csv 总结

1. 问题描述

每次都查系列,总结一下,以方便下次查。

在 Python 中,你可以使用内置的 csv 模块来读写 CSV(Comma-Separated Values)文件。

以下是一些基本的示例,展示如何使用 csv 模块来实现这一功能。

(1) 读取 CSV 文件

1
2
3
4
5
6
7
8
9
import csv

# 打开文件进行读取
with open('input.csv', newline='') as file:
reader = csv.reader(file)

# 遍历文件中的每一行
for row in reader:
print(row) # 打印每一行的数据 row: [list]

(2) 写入 CSV 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import csv

# 要写入的数据
rows = [
['Name', 'Age', 'City'],
['Alice', 24, 'New York'],
['Bob', 27, 'Los Angeles']
]

# 打开文件进行写入
with open('output.csv', 'w', newline='') as file:
writer = csv.writer(file)

# 写入数据
for row in rows:
writer.writerow(row)


使用 DictReaderDictWriter

如果你的 CSV 文件有表头,并且你想要以字典的形式读取或写入数据,可以使用 csv.DictReadercsv.DictWriter

(3) 读取 CSV 文件(使用 DictReader

1
2
3
4
5
6
7
8
9
10
11
import csv

# 打开文件进行读取
with open('dict_input.csv', newline='') as file:
reader = csv.DictReader(file)

# 遍历文件中的每一行
for row in reader:
print(row) # 打印每一行的数据


(4) 写入 CSV 文件(使用 DictWriter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import csv

# 要写入的数据
data = [
{'Name': 'Alice', 'Age': 24, 'City': 'New York'},
{'Name': 'Bob', 'Age': 27, 'City': 'Los Angeles'}
]

# 打开文件进行写入
with open('dict_output.csv', 'w', newline='') as file:
writer = csv.DictWriter(file, fieldnames=['Name', 'Age', 'City'])

# 写入表头
writer.writeheader()

# 写入数据
for row in data:
writer.writerow(row)


(5) 关于参数 newline=''

在 Python 中使用 open() 函数打开文件时,参数 newline='' 是用于指定文件在读取或写入时如何处理行终止符。这个参数在处理 CSV 文件时尤为重要,因为 CSV 文件的行分隔通常依赖于操作系统。

行终止符

  • Unix/Linux 系统:使用 \n 作为行终止符。
  • Windows 系统:使用 \r\n 作为行终止符。
  • Mac 系统(旧版,OS X 之前):使用 \r 作为行终止符。

newline 参数的作用

当使用 open() 函数打开文件进行读取或写入时,newline 参数决定了 Python 如何处理这些行终止符:

  • **newline=''**:告诉 Python 忽略行终止符,将它们视为普通的字符。这通常是处理文本文件(如 CSV)时的首选设置,因为它可以防止在读取或写入过程中出现意外的行合并或分隔。
  • **newline=None**:默认值。告诉 Python 根据操作系统自动处理行终止符。这意味着在 Windows 上,Python 会将 \r\n 视为行终止符;在 Unix/Linux 和 Mac 上,\n 是行终止符。
  • **newline='\n', '\r', '\r\n'**:显式指定行终止符。这在某些特定情况下可能很有用,但通常不推荐,因为它会使代码依赖于特定的操作系统。

为什么在打开 CSV 文件时使用 newline=''

当你使用 csv.readercsv.writer 处理 CSV 文件时,通常希望确保文件的行结构在读取和写入过程中保持不变。如果文件是在不同的操作系统上创建的,行终止符可能会不同,这可能会导致解析错误或数据不一致。

使用 newline='' 可以确保:

  • 无论文件是在哪个操作系统上创建的,Python 都会以一致的方式处理行终止符。
  • 防止在读取 CSV 文件时,由于行终止符的处理不当而导致的数据行合并或拆分。
  • 在写入 CSV 文件时,可以控制生成的行终止符,确保文件格式的一致性。

这是一个好习惯,特别是在处理跨平台的文本文件时,可以避免很多与操作系统相关的兼容性问题。

(6) 来个读写一起的栗子

Name Age City
Alice 24 New York
Bob 27 Los Angeles
  • 测试脚本栗子:根据 input.csv 内容,输出 output.csv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import csv


def read_write_csv_file(input_file_path, output_file_path):
# 打开文件进行读取
with open(input_file_path, newline='') as file:
reader = csv.DictReader(file)

# 输出字典
output_data = {}

with open(output_file_path, 'w', newline='') as file:
writer = csv.DictWriter(file, fieldnames=['城市', '名字', '年龄', '分数'])
# 遍历文件中的每一行

# 写入表头['城市', '名字', '年龄', '分数']
writer.writeheader()

for row in reader:
# 添加一个默认为 0 的列--得分
output_data['城市'] = row['City']
output_data['名字'] = row['Name']
output_data['年龄'] = row['Age']
output_data['分数'] = 0

# 写入行
writer.writerow(output_data)


if __name__ == '__main__':
read_write_csv_file('csv_files/input.csv', 'csv_files/output.csv')


  • output.csv 文件内容
城市 名字 年龄 分数
Alice 24 New York 0
Bob 27 Los Angeles 0