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.'")
为了学习,我正忙于 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.'")