我查找pandas是否原生支持读取分区parquet数据集时遇到了这个问题。我必须说,当前的答案过于冗长(使其难以解析)。而且我想象中,根据大小不断打开/关闭文件句柄然后扫描它们的末尾并不是特别高效。
更好的选择是将所有的parquet文件读入一个单独的DataFrame中,并一次性写入:
from pathlib import Path
import pandas as pd
data_dir = Path('dir/to/parquet/files')
full_df = pd.concat(
pd.read_parquet(parquet_file)
for parquet_file in data_dir.glob('*.parquet')
)
full_df.to_csv('csv_file.csv')
或者,如果你真的只想将内容追加到文件中:
data_dir = Path('dir/to/parquet/files')
for i, parquet_path in enumerate(data_dir.glob('*.parquet')):
df = pd.read_parquet(parquet_path)
write_header = i == 0
write_mode = 'w' if i == 0 else 'a'
df.to_csv('csv_file.csv', mode=write_mode, header=write_header)
另一种将每个文件附加到目标CSV文件的最终选择是,在开头以 "a+"
模式打开目标文件,对于每次写入/附加都将文件句柄扫描到文件末尾(我相信这是有效的,但尚未实际测试):
data_dir = Path('dir/to/parquet/files')
with open('csv_file.csv', "a+") as csv_handle:
for i, parquet_path in enumerate(data_dir.glob('*.parquet')):
df = pd.read_parquet(parquet_path)
write_header = i == 0
df.to_csv(csv_handle, header=write_header)