我目前正在使用以下代码导入6,000个csv文件(带标题)并将它们导出到单个csv文件中(带有单个标题行)。
#import csv files from folder
path =r'data/US/market/merged_data'
allFiles = glob.glob(path + "/*.csv")
stockstats_data = pd.DataFrame()
list_ = []
for file_ in allFiles:
df = pd.read_csv(file_,index_col=None,)
list_.append(df)
stockstats_data = pd.concat(list_)
print(file_ + " has been imported.")
此代码工作正常,但速度很慢。处理最多可能需要2天。
我为终端命令行提供了一个单行脚本,它执行相同的操作(但没有标题)。这个脚本需要20秒。
for f in *.csv; do cat "`pwd`/$f" | tail -n +2 >> merged.csv; done
有谁知道如何加速第一个Python脚本?为了缩短时间,我考虑过不将它导入DataFrame并只是连接CSV,但我无法弄清楚。
感谢。
答案 0 :(得分:12)
如果你不需要内存中的CSV,只需要从输入复制到输出,那么避免解析就会便宜很多,并且复制而不会在内存中建立:
y2
就是这样; shutil.copyfileobj
处理有效复制数据,大大减少了Python级别的解析和重新序列化工作。
这假设所有CSV文件具有相同的格式,编码,行结尾等,并且标题不包含嵌入的换行符,但如果是这种情况,则它比替代品快得多。
答案 1 :(得分:6)
您是否需要在Python中执行此操作?如果您完全在shell中执行此操作,那么您需要做的就是在运行单行程序之前,首先cat
从随机选择的输入.csv文件到merged.csv
的标题行:< / p>
cat a-randomly-selected-csv-file.csv | head -n1 > merged.csv
for f in *.csv; do cat "`pwd`/$f" | tail -n +2 >> merged.csv; done
答案 2 :(得分:1)
你不需要pandas,只需简单的csv
模块即可。
import csv
df_out_filename = 'df_out.csv'
write_headers = True
with open(df_out_filename, 'wb') as fout:
writer = csv.writer(fout)
for filename in allFiles:
with open(filename) as fin:
reader = csv.reader(fin)
headers = reader.next()
if write_headers:
write_headers = False # Only write headers once.
writer.writerow(headers)
writer.writerows(reader) # Write all remaining rows.
答案 3 :(得分:0)
这是一种更简单的方法-您可以使用熊猫(尽管我不确定它如何帮助使用RAM)-
import pandas as pd
import glob
path =r'data/US/market/merged_data'
allFiles = glob.glob(path + "/*.csv")
stockstats_data = pd.DataFrame()
list_ = []
for file_ in allFiles:
df = pd.read_csv(file_)
stockstats_data = pd.concat((df, stockstats_data), axis=0)