3 回答
TA贡献1786条经验 获得超11个赞
移动到选定的目录然后做事。
额外提示:在 python 2 中使用 raw_input 来避免特殊字符错误,如:或\(仅input在 python 3 中使用)
import os
filenames = raw_input('Please enter your file path: ')
if not os.path.exists(filenames):
print 'BAD PATH'
return
os.chdir(filenames)
with open ("files.txt", "w") as a:
for path, subdirs, files in os.walk('.'):
for filename in files:
f = os.path.join(path, filename)
a.write(str(f) + os.linesep)
TA贡献1793条经验 获得超6个赞
您必须更改with open ("files.txt", "w") as a:语句以不仅包含文件名,还包含路径。这是您应该使用的地方os.path.join()。Id 可以方便地首先检查用户输入是否存在os.path.exists(filepath).
os.path.join(input(...))对 没有真正意义input,因为它返回一个单一的str,所以没有单独的东西要加入。
import os
filepath = input('Please enter your file path: ')
if os.path.exists(filepath):
with open (os.path.join(filepath, "files.txt"), "w") as a:
for path, subdirs, files in os.walk(filepath):
for filename in files:
f = os.path.join(path, filename)
a.write(f + os.linesep)
请注意,您的文件列表将始终包含一个files.txt-entry,因为文件是在os.walk()获取文件列表之前创建的。
正如ShadowRanger 亲切地指出的那样,这种LBYL(在你跳跃之前先看)方法是不安全的,因为存在检查可能通过,尽管文件系统在进程运行时稍后更改,导致异常。
提到的 EAFP(请求宽恕比许可更容易)方法将使用一个try... except块来处理所有错误。
这种方法可能如下所示:
import os
filepath = input('Please enter your file path: ')
try:
with open (os.path.join(filepath, "files.txt"), "w") as a:
for path, subdirs, files in os.walk(filepath):
for filename in files:
f = os.path.join(path, filename)
a.write(f + os.linesep)
except:
print("Could not generate directory listing file.")
您应该通过捕获特定异常来进一步完善它。try块中的代码越多,与目录读取和文件写入无关的错误也就越多被捕获和抑制。
添加回答
举报