我有一份日期清单。
output = pd.concat([pd.read_csv('filename_{0}.csv'.format(x)) for x in dates])
我通常做的是:
output = pd.concat([reader('filename_{0}.csv'.format(x)) for x in dates])
def reader(x):
if os.path.isfile(x):
return pd.read_csv(x)
else:
?????
但是,当文件不存在时,该行不起作用。
所以我创建了一个包装函数:
{{1}}
问题出现了:如果我不知道文件的标题是什么,我应该把它作为返回值?
答案 0 :(得分:2)
output = pd.concat([pd.read_csv('filename_{0}.csv'.format(x)) for x in dates if os.path.isfile('filename_{0}.csv'.format(x))])
将无效文件传递给pd.concat
。
假设文件夹中存在以下文件:
file0.csv
file2.csv
file3.csv
file5.csv
file8.csv
file9.csv
dates = list(range(10))
results = ['file{0}.csv'.format(x) for x in dates if os.path.isfile('file{0}.csv'.format(x))]
# results:
#
# [file0.csv,
# file2.csv,
# file3.csv,
# file5.csv,
# file8.csv,
# file9.csv,]
答案 1 :(得分:0)
调用您的函数为每个可能的文件返回一些内容。由于您想要跳过某些内容,请将迭代逻辑移动到您的函数中,然后通过yielding
名称将其转换为生成器:
def reader(files_iterator):
for filename in files_iterator:
if os.path.isfile(filename):
yield pd.read_csv(x)
像这样使用:
output = pd.concat(list(reader('filename_{}.csv'.format(x) for x in dates)))