我有以下代码,该代码递归地遍历包含数千个csv的目录,并尝试将它们全部读取并添加到一个DataFrame中:
df = pd.DataFrame()
symbol = symbol.upper()
for filepath in glob.iglob(r'W:\data\{0}\option\**\**\**.csv'.format(188), recursive=True):
optionNameCSI = filepath.split("\\")[-1].split('.')[0]
try:
tmp = pd.read_csv(filepath, engine='c')
strike = tmp['Strike'].iloc[-1]
expiry = pd.to_datetime(tmp['Option Expiration Date'].iloc[-1])
m = expiry.month
y = expiry.year
PutCall = tmp['PutCall'].iloc[-1]
future = symbol + numToLetter[m] + str(y)
except (IndexError, KeyError) as e:
continue
if tmp.empty:
df = tmp
else:
df = df.append(tmp)
print(optionName, 'loaded')
但是,此代码开始迭代非常快,然后呈指数下降,并且永远不会完成。我做错了什么吗?我知道文件路径都可以正确获取,所以问题在于DataFrame的增长。
答案 0 :(得分:3)
考虑将您的代码分成单独的函数,如下所示:
def get_data_from_csv(filepath):
optionNameCSI = filepath.split("\\")[-1].split('.')[0]
try:
df = pd.read_csv(filepath, engine='c')
# do stuff ...
return df
except (IndexError, KeyError) as e:
return
然后您可以使用列表推导来收集列表中的所有数据,就像上面的人建议的那样
filepaths = glob.iglob(r'W:\data\{0}\option\**\**\**.csv'.format(188), recursive=True)
result = [get_data_from_csv(filepath) for filepath in filepaths]
result = [r for r in result if r is not None] # remove 'None' values
然后使用pd.concat
df = pd.concat(result)