Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python os.walk始终附加根目录_Python_Root_Os.walk - Fatal编程技术网

Python os.walk始终附加根目录

Python os.walk始终附加根目录,python,root,os.walk,Python,Root,Os.walk,为了学习,我正忙于Python的一个项目 我被一件非常奇怪的事情困住了 下面是我运行良好的代码,代码的一小部分,但它也会产生相同的错误: 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):

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

我被一件非常奇怪的事情困住了

下面是我运行良好的代码,代码的一小部分,但它也会产生相同的错误:

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中找到,但每当printos.path.abspathfile部分出现时,它总是附加到存储脚本的我的根文件夹

我似乎无法发现我做错了什么

更新的输出示例:

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

无论何时调用os.walk,它都会返回根目录、目录列表和文件列表。尽管您的程序读起来像是正确的英语,但它并没有做您希望它在Python中做的事情。dirs中的文件行没有查看目录中的所有文件;它只是在根目录的所有子文件夹上循环。我认为您真正想要的是循环文件:

您可以使用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.'")

你能举例说明不正确的输出吗?问题是什么还不清楚。附加的我的根文件夹没有意义。添加了输出示例。您希望输出是什么?好吧,我希望它显示文件的实际绝对路径,而不是python脚本存储的路径。好吧,我不寻找任何特定文件,我想要所有以我要查找的扩展名结尾的文件。我以前有过这个问题,仍然是一样的问题。它确实正确地循环了所有文件。但是当我打印它时,它的绝对路径+文件名总是显示存储python脚本的文件夹。请参阅OP,我附加了一个输出示例。@Nerotix是否有行fullfile=os.path.joinroot、file和print abspathfullfile?我更新了我的答案。请记住,文件是文件名列表,而不是文件路径列表。要获得完整路径,您必须使用名称连接根。请尝试,给我几分钟时间。谢谢@Nerotix是否确实复制并粘贴了代码?或者您为原始输入提供了正确的路径?我只是测试了一下,它确实起作用了……我没有这样做,否决投票o我无论如何都更新了,并选择它作为答案。再次谢谢,先生!我喜欢使用str.endswith,但是嵌套理解不容易一眼就能理解。如果它不止一个,就像它通常应该只是一个for循环一样,IMHO。@CodyPiersall,OP可能希望将行存储在一个列表中,惰性地求值或传递给一个函数,生成器表达式为它们提供了执行任何这些操作的选项,但可读的方式仍然是使用一个实际的函数来生成文件。
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.'")
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.'")