Python - IOError:[Errno 13]权限被拒绝

时间:2016-09-22 21:33:42

标签: python

我试图从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)

1 个答案:

答案 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,您不必担心它 - 退出块时文件句柄会立即关闭。