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