【问题标题】:How to create a list of files with relative path to the files in python?如何在python中创建具有文件相对路径的文件列表?
【发布时间】:2018-06-28 22:33:02
【问题描述】:

所以我正在编写一个 cli 工具,它获取一个文件并计算该文件的校验和 (CRC32)。我希望我的工具有 recursion 作为选项。所以我想要一个目录中所有文件的列表,以便我可以将它作为参数传递给我的校验和方法。

注意:“Test Dir/”是与脚本在同一文件夹中的目录,通过终端输入,而不是设置变量。

到目前为止我有:

rootDir = ['Test Dir/']
files = []

for i in rootDir:
    if not os.path.isdir(i):
       files.append(i)
    else:
        for dir_, _, files in os.walk(i):
            for fileName in files:
                relDir = os.path.relpath(dir_, i)
                relFile = os.path.join(relDir, fileName)
                files.append(relFile)

这会返回:

['./root.py', './root.txt', 'Lv1/lv1.py', 'Lv1/lv1.pyc', 'Lv1/lv1.txt', 'Lv1/Lv2/lv2.pyc', 'Lv1/Lv2/lv2.py', 'Lv1/Lv2/lv2.txt', 'Lv1/Lv2/Lv3/lv3.txt', 'Lv1/Lv2/Lv3/lv3.py', 'Lv1/Lv2/Lv3/lv3.pyc']

但如果我输入 rootDir 作为 'Test Dir/*',我会得到:

['./lv1.py', './lv1.pyc', './lv1.txt', 'Lv2/lv2.pyc', 'Lv2/lv2.py', 'Lv2/lv2.txt', 'Lv2/Lv3/lv3.txt', 'Lv2/Lv3/lv3.py', 'Lv2/Lv3/lv3.pyc', 'Test Dir/root.py', 'Test Dir/root.txt']

相同的文件,但列表略有不同。

我想要的是: ['Test Dir/root.py', 'Test Dir/root.txt', 'Test Dir/Lv1/lv1.py', 'Test Dir/Lv1/lv1.pyc', 'Test Dir/Lv1/lv1.txt', 'Test Dir/Lv1/Lv2/lv2.pyc', 'Test Dir/Lv1/Lv2/lv2.py', 'Test Dir/Lv1/Lv2/lv2.txt', 'Test Dir/Lv1/Lv2/Lv3/lv3.txt', 'Test Dir/Lv1/Lv2/Lv3/lv3.py', 'Test Dir/Lv1/Lv2/Lv3/lv3.pyc']

现在我知道我可以使用字符串操作来做到这一点,但这似乎不是很干净...... 真的希望有人可以帮助我。

【问题讨论】:

  • 您将rootDir 视为for 循环中的字符串列表,但您仅使用'TestDir/ 字符串对其进行了初始化?您确定要向我们展示实际代码吗?你的目录结构是什么样的?此外,else 块似乎需要更多缩进。
  • 不,这不是我实际使用 argparse 获取 rootDir 的实际代码。但你提到的其他几点是有效的。请稍等,我将进行编辑。

标签: python python-3.x list recursion terminal


【解决方案1】:

os.path.relpath 的工作方式是它只包含给定基本路径下的路径名,因此如果您希望最终列表全部包含基本路径名,您实际上不需要 os.path.relpath 开始与。

此外,您用于for 循环的files 变量隐藏了您在开始时初始化并在for 循环中使用的files 列表。您的代码实际上不会完成,因为您在将其用作迭代器时不断附加到列表。你应该给它取个别的名字。

您的代码应更正为:

rootDir = ['Test Dir/']
paths = []

for i in rootDir:
    if not os.path.isdir(i):
       paths.append(i)
    else:
        for dir_, _, files in os.walk(i):
            for fileName in files:
                paths.append(os.path.join(i, fileName))

【讨论】:

  • 这不起作用。我明白你在说什么,尽管我会尝试解决这个问题。谢谢。附:我对我的列表和生成器 var 使用相同的 var 名称不好:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2011-04-28
  • 2014-12-11
  • 2011-05-18
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
相关资源
最近更新 更多