【问题标题】:getting path for files in sub_directory获取子目录中文件的路径
【发布时间】:2015-12-07 11:03:21
【问题描述】:

我编写了以下代码来获取子文件夹中文件的路径。

import os
os.chdir('C:\Users\mike\Desktop\a')
base_dir = os.getcwd()
sub_dirs = [os.path.join(base_dir, d) for d in os.listdir(base_dir)]
for i in os.listdir(sub_dirs):
    path = [os.path.join(sub_dirs), i]

但它不起作用,我收到此错误: 回溯(最近一次通话最后): 文件“C:\Users\mike\Desktop\mine1.py”,第 6 行,在 对于 os.listdir(sub_dirs) 中的 m: TypeError:强制转换为 Unicode:需要字符串或缓冲区,找到列表

有什么问题?

干杯

【问题讨论】:

  • 你想让os.path.join(sub_dirs)做什么?
  • 我想为我的文本文件设置一个路径,如下所示:>>> path 'C:\\Users\\mike\\Desktop\\a\x03\x01.txt'
  • 题外话:对字符串文字 Windows 路径使用原始字符串,否则当路径组件第一次以 ab 开头时,您会感到很意外、fn(可能还有其他几个)。对于非原始字符串,\b 是 ASCII 退格字符,而不是后跟 b 的反斜杠,类似问题适用于其他示例。最好是安全的并始终使用原始字符串,例如,在您的示例中,r'C:\Users\mike\Desktop\a'(注意在打开引号之前前导 r)。

标签: python


【解决方案1】:

os.listdir 需要一个字符串或 unicode 作为参数。你的sub_dirs 是一个字符串列表。

【讨论】:

    【解决方案2】:

    以下是否解决了您的问题?

    import os
    os.chdir('C:\Users\mike\Desktop\a')
    rootDir = os.getcwd()
    fileSet = set()
    
    for dir_, _, files in os.walk(rootDir):
        for fileName in files:
            relDir = os.path.relpath(dir_, rootDir)
            relFile = os.path.join(relDir, fileName)
            fileSet.add(relFile)
    

    【讨论】:

    • 不是。我从 python 得到这个答案: set(['2\\2.txt', '3\\3.txt', '1\\4.txt', '2\\3.txt', '1\\ 5.txt', '1\\2.txt', '1\\1.txt', '1\\3.txt', '3\\1.txt', '3\\2.txt', '2\\1.txt']) 而我需要一个完整路径,例如:'C:\\Users\\mike\\Desktop\\a\x03\x01.txt' 谢谢
    【解决方案3】:

    递归万岁!

    def recurse(files, directory):
        for item in os.listdir(directory):
            full_path = os.path.join(directory, item)
            if os.path.isdir(full_path):
                recurse(files, full_path)
            else:
                files.append(full_path)
    
    files = []
    recurse(files, 'C:\Users\mike\Desktop\a')
    

    现在您的“文件”列表将被填满。

    如果您希望能够遍历每个目录的内容,可以将它们放在子列表中:

    def recurse(directories, directory):
        files = []
        for item in os.listdir(directory):
            full_path = os.path.join(directory, item)
            if os.path.isdir(full_path):
                recurse(directories, full_path)
            else:
                files.append(full_path)
        if len(files) > 0:
            directories.append((directory, files))
    
    directories = []
    
    recurse(directories, 'C:\Users\mike\Desktop\a')
    
    for directory, files in directories:
        # "directory" is provided as reference (eg "C:\Users\mike\Desktop\a\a1")
        for path in files:
            # loop over each file in "directory"
            pass
    

    【讨论】:

    • 非常感谢,您的代码有效,并为我提供了所有文件路径。但是想象一下,如果我在文件夹“a”(a1、a2、a3)中有 3 个文件夹,并且希望文件路径位于 3 个不同的循环中; (我的意思是,我在第一个循环中获得了 a1 中的文件路径。然后这些值被第二个循环中的 a2 中的路径替换,最后被第三个循环中的 a3 中的文件路径替换)。如何更改我的原始代码以具有这些循环?
    • 更新了代码,让你可以显式地遍历子目录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2023-04-05
    • 2017-03-05
    • 2014-04-18
    • 1970-01-01
    • 2016-01-17
    • 2015-10-29
    相关资源
    最近更新 更多