你需要修改 with open ("files.txt", "w") as a:
这句话不仅包含文件名,还要包含路径。这就是你应该使用 os.path.join()
的地方。最好先使用 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
条目,因为在{{link1:
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
块中的代码越多,那么也会抓住并压制更多与目录读取和文件写入无关的错误。