我试图从argv获取一个本地目录并遍历该文件夹并打印其中每个文件的内容。但是我得到一个[Errno] 13说允许被拒绝。我曾尝试过研究这个问题,但空手而归。
#!/usr/bin/python
import os
import sys
path = open(sys.argv[1],'r') #'inputs/' path to working input dir
file_list = os.listdir(path) #create list of filenames in path dir
for fn in file_list:
file = open(path+'/'+fn) #open each file in dir for manipulation
for line in file:
print(line)
答案 0 :(得分:1)
os.listdir()
,顾名思义,返回给定目录的所有占用者列表,包括文件和目录(如果您在Unix / Linux上,还有其他内容,如符号链接和设备)和诸如此类的东西)。然后,您将盲目地尝试open()
列表中的每个项目以及print()
其内容。不幸的是,open()
仅适用于类文件对象,特别是不在目录上工作,因此Errno 13,Permission Denied。
另一种方法是使用os.scandir()
,它的工作方式略有不同。 os.scandir()
不会返回您可以立即阅读的平面列表,而是返回generator,它基本上会根据您的要求提供对象,而不是一次性全部给您。事实上,以下适用于文档的代码是您需要的良好起点:
for entry in os.scandir(path):
if entry.is_file():
print(entry.name)
os.scandir()
正在返回DirEntry
个对象。只需使用os.path.join()
从原始代码中传递给path
的{{1}}参数中创建一个完整路径名,然后从上面的代码中os.listdir()
创建一个完整路径名,然后使用with
上下文管理器,entry.name
文件并显示其内容:
open()
使用for entry in os.scandir(path):
if entry.is_file():
with open(os.path.join(path, entry), "r") as f:
for line in f:
print(line)
的一个优点是,您不必记得关闭使用此类内容时分配的文件句柄:
with
否则,你有一个悬挂的文件句柄可能可能会导致问题,具体取决于你有多少以及你用它们做了什么。 f = open("myfile.txt, "r")
# do stuff with f
...
f.close()
close()
你的open()
是一个很好的做法。使用with
,您不必担心它 - 退出块时文件句柄会立即关闭。