📅  最后修改于: 2023-12-03 15:24:18.408000             🧑  作者: Mango
有时候,我们需要在 Pandas 中处理海量的文件,而这些文件可能会很大,无法一次性将它们全部读取进内存中。如果我们直接使用 Pandas 的 read_csv
函数来读取这些文件,很可能会因为内存不足而导致程序崩溃。
那么,如何在 Pandas 中以小块的形式加载海量文件呢?解决方案是使用 Pandas 中的 read_csv
函数的 chunksize
参数。
chunksize
参数read_csv
函数的 chunksize
参数可以让我们按照指定的大小将文件分块读取。具体来说,我们可以指定每个块的行数,然后逐个读取每个块,处理完一个块后再读取下一个块,直到将整个文件读取完毕。
以下是使用 chunksize
参数读取海量文件的示例代码:
import pandas as pd
# 定义每个块的大小为 1000 行
chunksize = 1000
# 逐个读取每个块,并对每个块进行处理
for chunk in pd.read_csv('filename.csv', chunksize=chunksize):
# 在这里对每个块进行处理
# ...
上面的代码中,我们首先定义了每个块的大小(这里设为 1000 行),然后使用 pd.read_csv
函数按照这个块的大小逐块读取文件。读取到的每个块都是一个 Pandas 的 DataFrame 对象,我们可以在循环中对每个块进行处理。
如果我们需要处理多个文件,我们可以使用 Python 的 glob
模块来获取这些文件的路径列表,然后逐个读取这些文件。以下是处理多个文件的示例代码:
import glob
import pandas as pd
# 获取所有文件的路径列表
file_paths = glob.glob('folder/*.csv')
# 定义每个块的大小为 1000 行
chunksize = 1000
# 逐个读取每个文件和每个块,并对每个块进行处理
for file_path in file_paths:
for chunk in pd.read_csv(file_path, chunksize=chunksize):
# 在这里对每个块进行处理
# ...
上面的代码中,我们首先使用 glob.glob
函数获取所有以 .csv
结尾的文件的路径列表,然后逐个读取每个文件和每个块,对每个块进行处理。
如果我们需要进一步加快处理速度,可以考虑使用多进程来并行处理多个文件。以下是使用多进程处理多个文件的示例代码:
import glob
import pandas as pd
from multiprocessing import Pool
# 定义每个块的大小为 1000 行
chunksize = 1000
# 定义处理每个块的函数
def process_chunk(chunk):
# 在这里对每个块进行处理
# ...
# 定义处理每个文件的函数
def process_file(file_path):
for chunk in pd.read_csv(file_path, chunksize=chunksize):
process_chunk(chunk)
# 获取所有文件的路径列表
file_paths = glob.glob('folder/*.csv')
# 使用多进程处理每个文件
with Pool() as pool:
pool.map(process_file, file_paths)
上面的代码中,我们定义了一个 process_chunk
函数来处理每个块,定义了一个 process_file
函数来处理每个文件,在 process_file
函数中使用 pd.read_csv
函数读取每个文件和每个块,并在循环中调用 process_chunk
函数进行处理。
然后,我们使用 glob.glob
函数获取所有文件的路径列表,使用多进程中的 Pool
对象的 map
方法并行处理每个文件。