当我们有多个 csv 文件并且所有 csv 的总大小约为 20gb 时,如何分块导入和读取多个 CSV?
我不想使用 Spark
,因为我想在 SkLearn 中使用模型,所以我想在 Pandas
本身中找到解决方案。
我的代码是:
allFiles = glob.glob(os.path.join(path, "*.csv"))
df = pd.concat((pd.read_csv(f,sep=",") for f in allFiles))
df.reset_index(drop=True, inplace=True)
但这失败了,因为我路径中所有 csv 的总大小为 17gb。
我想分块阅读,但如果我这样尝试会出现一些错误:
allFiles = glob.glob(os.path.join(path, "*.csv"))
df = pd.concat((pd.read_csv(f,sep=",",chunksize=10000) for f in allFiles))
df.reset_index(drop=True, inplace=True)
我得到的错误是这样的:
"cannot concatenate object of type ""; only pd.Series, pd.DataFrame, and pd.Panel (deprecated) objs are valid"
有人可以帮忙吗?
最佳答案
要读取大型 csv 文件,您可以使用 chunksize 但在这种情况下,您必须像这样使用迭代器:
for df in pd.read_csv('file.csv', sep=',', iterator=True, chunksize=10000):
process(df)
你必须连接或追加每个 block
或者你可以这样做:
df = pd.read_csv('file.csv',, sep=',', iterator=True, chunksize=10000)
for chunk in df:
process(chunk)
读取多个文件:例如
listfile = ['file1,'file2]
dfx = pd.DataFrame()
def process(d):
#dfx=dfx.append(d) or dfx = pd.concat(dfx, d)
#other coding
for f in listfile:
for df in pd.read_csv(f, sep=',', iterator=True, chunksize=10000):
process(df)
当你有很多文件后,你可以使用多处理库中的 DASK 或 Pool 来启动大量读取过程
反正要么你内存够,要么你浪费时间
关于python - 分块读取 Pandas 中的多个 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54987682/