【问题标题】:How do you process all files in a folder? [duplicate]如何处理文件夹中的所有文件? [复制]
【发布时间】:2019-06-19 05:04:18
【问题描述】:

我想在一个目录中的所有文件上运行我的代码。该代码在单个文件上运行良好,但我尝试迭代多个文件告诉我

FileNotFoundError: [Errno 2] 没有这样的文件或目录:'file.xlsx'

directory = r"C:/Users/name/Desktop/folder/2018"
arrivals_aggregated = pd.DataFrame()

print(os.listdir(directory))
for filename in os.listdir(smt_directory):

    print('current file is ' + filename)
    x = pd.ExcelFile(filename)
    symbols = x_symbols(x)
    arv = x.parse(sheet_name='Arrivals', skiprows=5, usecols=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
    arrivals = x_arrivals(arv, x)

arrivals_aggregated.append(arrivals)

我希望它遍历目录中的所有文件,处理并将结果聚合到一个大数据帧arrivals_aggregated。相反,它停在 x = pd.ExcelFile(filename) 处,说找不到该文件,即使它在那里,甚至在我包含时打印

print('当前文件是'+文件名)

它在文件夹中的第一个文件上失败,而没有处理代码。

【问题讨论】:

  • 旁注:在现代 Python 中,最简单的解决方法是将 for filename in os.listdir(...): 替换为 for entry in os.scandir(...):,并将 filename(您想要完整路径的位置)的用法更改为 entry.path或(您希望名称不带路径)到entry.namescandirlistdir 快,并且还允许您免费(或至少缓存)访问文件上的 stat 相关信息(例如,它实际上是文件还是目录,大小是多少等)。 )。
  • 谢谢。我正在寻找您在此处建议的调整,因为我可能对统计数据感兴趣,并且可能会将其合并到代码中以进行某些选择。你究竟是如何建议我更新代码的?对于 os.scandir(...) 中的条目:然后用 entry.path 替换文件名?
  • 是的。完全不需要os.path.join;合格的路径直接可用,无需额外工作。

标签: python pandas directory-structure listdir


【解决方案1】:

这是否有效取决于您运行脚本的位置。如果您运行脚本的目录中不存在filename,那么您将获得FileNotFoundError

我会这样做:

x = pd.ExcelFile(os.path.sep.join([directory, filename]))

这将确保您将真实的文件位置传递给pd.ExcelFile

【讨论】:

  • 不要使用.sep;模块中已经有一个目录连接函数,它在位置上接受参数(并且处理一些边缘情况纯字符串连接不处理),所以os.path.sep.join([directory, filename]) 简化为os.path.join(directory, filename)(删除.sep[] 删除)。
  • 完全成功,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2015-05-10
  • 1970-01-01
  • 2019-02-19
  • 2016-04-10
  • 2013-12-20
  • 1970-01-01
相关资源
最近更新 更多