📅  最后修改于: 2023-12-03 15:39:16.062000             🧑  作者: Mango
通常情况下,Pandas 读取 CSV 文件是将整个文件加载到内存中再进行操作,但是当文件很大时,这样做会导致内存不足的问题。为了避免这个问题,我们可以将大的 CSV 文件分块读取。
我们先创建一个包含 1000 行的 CSV 文件,文件名为 data.csv
。
import pandas as pd
import numpy as np
import csv
with open('data.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['id', 'name', 'age'])
for i in range(1000):
writer.writerow([i + 1, f'User {i+1}', np.random.randint(18, 60)])
我们可以使用 pandas.read_csv()
方法,并设置 chunksize
参数来分块读取 CSV 文件。
chunk_size = 100 # 设置分块大小
csv_reader = pd.read_csv('data.csv', chunksize=chunk_size)
for i, chunk in enumerate(csv_reader):
# 处理每个分块的数据
print(f'Chunk {i+1}:')
print(chunk)
输出结果:
Chunk 1:
id name age
0 1 User 1 20
1 2 User 2 51
2 3 User 3 41
3 4 User 4 50
4 5 User 5 31
.. .. ... ...
95 96 User 96 52
96 97 User 97 20
97 98 User 98 57
98 99 User 99 59
99 100 User 100 19
[100 rows x 3 columns]
Chunk 2:
id name age
100 101 User 101 44
101 102 User 102 27
102 103 User 103 40
103 104 User 104 18
104 105 User 105 36
.. ... ... ...
195 196 User 196 36
196 197 User 197 31
197 198 User 198 19
198 199 User 199 37
199 200 User 200 29
[100 rows x 3 columns]
...
在上面的示例中,代码只是简单地打印了每个分块的数据。如果要处理分块中的数据,则需要在循环中添加代码进行处理。
for i, chunk in enumerate(csv_reader):
# 对每个分块进行处理
result = chunk.groupby('age').count().reset_index()
# 将结果写入文件
with open(f'result-{i+1}.csv', 'w') as f:
result.to_csv(f, index=False)
上面的代码对每个分块进行了分组(按年龄分组),并统计每组数量。最后,将结果写入到一个独立的 CSV 文件 result-n.csv
中。
以上就是如何将大 CSV 文件分块读取的介绍。通过设置 chunksize
参数,可以有效避免内存不足的问题。在使用分块处理数据时也可以进行一些列的数据处理,并将结果写入到独立的文件中。