【问题标题】:How can one iterate through files in folder in natural sort order using glob.glob(path)?如何使用 glob.glob(path) 以自然排序顺序遍历文件夹中的文件?
【发布时间】:2022-01-19 14:16:41
【问题描述】:

我目前正在尝试做一些非常基本的事情:计算 .csv 文件中两个单元格的总和并将其输出到新的 DataFrame 中。然后,我对该 .csv 文件中的多行以及文件夹中的多个文件重复此操作。毕竟,我将 DataFrame 输出到 .xlsx 文件。代码主体如下:

for fname in glob.glob(path):
    print(fname)
    processed = []
    df = pd.read_csv(fname)
    for index, row in df.iterrows():
        processed.append(row['Rejected'] + row['Sorted'])
    heatMap[str(counter)] = processed
    counter += 1

newfname = '输出.xlsx' heatMap.to_excel(newfname)

但是,当我查看我新创建的 DataFrame 时,这些列是乱序的。检查控制台,我可以看到文件按字母数字顺序迭代。

Console output

我想知道如何调整我的方法,以便我可以按自然排序顺序(1、2、3、4、5 等)遍历文件,所以我不必更改名称每个文件。

谢谢!

【问题讨论】:

  • 粘贴文本代替屏幕截图
  • 什么是二进制顺序
  • 帖子已被编辑为在文本中包含正文而不是屏幕截图。
  • 帖子已被编辑删除术语二进制顺序,这是我写的错误。

标签: python dataframe csv iteration glob


【解决方案1】:
for fname in sorted(glob.glob(path)):
    ...

这使得 glob 迭代成为一个列表,以便我们可以使用 python sorted 关键字对其进行排序。然后,您可以按字母顺序循环浏览它。

对于自然排序,有一个natsort 包。

from natsort import natsorted
for fname in natsorted(glob.glob(path)):
    ...

【讨论】:

  • 顺便说一下,glob.glob() 已经返回了一个列表,所以你不需要在上面调用list
  • 我的问题仍然存在,文件在 1、10、11、12、13 ... 2、20、21、23.... 3、30、31、 32、33....等模式。
  • 这是正确的alphanumerical order,你真正想要的是natual sorting(有pypi lib)
  • 谢谢,我知道我用错了字母数字。这是字母数字排序的正确答案,但我实际上是在寻找自然排序。我将编辑我的帖子。
  • 更新了我的答案以包括自然排序
猜你喜欢
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2014-08-15
  • 2019-05-08
  • 1970-01-01
  • 2016-07-19
  • 2023-04-04
  • 2021-07-01
相关资源
最近更新 更多