Python os.walk 始终附加根

Python os.walk always attaches root

为了学习,我正忙于 Python 中的一个项目。

我在 atm 上遇到了一些非常奇怪的事情..

这是我的代码运行(代码的一小部分,但它也会产生相同的错误):

import os

path_input = raw_input('Give path to check for documents(e.g. /Users/Frank/Desktop): ')
if os.path.isdir(path_input):
    for root, dirs, files in os.walk(path_input):
        for file in dirs:
            if os.path.splitext(file)[1].lower() in ('.docx', '.pdf', '.doc', '.pptx', '.txt',
                '.ppt', 'xls', 'xlsx'):
                print(os.path.abspath(file))
else:
    print("\nPlease enter a valid path, for example: '/Users/Frank/Documents.'")

它读取它遇到的任何文件,它在 os.walk 中找到,但是每当 print(os.path.abspath(file)) 部分出现时,它总是附加我存储脚本的根文件夹。

我似乎无法找出我做错了什么。

更新(添加输出示例):

/Users/Username/Dropbox/Test/Python/version5.txt
/Users/Username/Dropbox/Test/Python/version6.txt
/Users/Username/Dropbox/Test/Python/version7.txt

如您所见,它总是显示“/Users/Username/Dropbox/Test/Python/” 这与它存储的 python 脚本的位置相同,而 .txt 文件存储在另一个位置。

每当您调用 os.walk 时,它 returns root目录 的列表和一个 个文件 的列表。尽管您的程序读起来像正确的英语,但它并没有按照 Python 中的要求执行。 for file in dirs 行是 而不是 查看目录中的所有文件;它只是遍历 root 的所有子文件夹。我认为您真正想要的是循环遍历 files 而不是:

import os

path_input = raw_input('Give path to check for documents(e.g. /Users/Frank/Desktop): ')
if os.path.isdir(path_input):
    for root, dirs, files in os.walk(path_input):
        ### iterate over files instead of dirs
        for file in files:
            # The full file path needs to be made by joining with root.
            fullfile = os.path.join(root, file)
            if os.path.splitext(fullfile)[1].lower() in ('.docx', '.pdf', '.doc', '.pptx', '.txt',
                '.ppt', 'xls', 'xlsx'):
                print(os.path.abspath(fullfile))
else:
    print("\nPlease enter a valid path, for example: '/Users/Frank/Documents.'")

您可以使用str.endswith找到您匹配的文件,您还需要搜索文件而不是目录并加入根目录:

import os

ends = ('.docx', '.pdf', '.doc', '.pptx', '.txt','.ppt', 'xls', 'xlsx')
path_input =  raw_input('Give path to check for documents(e.g. /Users/Frank/Desktop): ')
if os.path.isdir(path_input):
     files = (os.path.abspath(f) for root, dirs, files in os.walk(path_input)
              for f in files if f.endswith(ends))
    for f in files:
        print(f)
else:
    print("\nPlease enter a valid path, for example: '/Users/Frank/Documents.'")