2016-09-22 273 views
-3

我試圖從argv獲取一個本地目錄並遍歷該文件夾並打印其中每個文件的內容。但是,我得到[Errno] 13的權限被拒絕。我試着研究這個問題,但是空手而歸。Python - IOError:[Errno 13] Permission denied

#!/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

你有沒有讀過這個呢:http://stackoverflow.com/questions/10575750/python-ioerror-errno-13-permission-denied –

+0

是的,這篇文章是關於寫出來的。我只是想弄清楚爲什麼我沒有權限讀取文件。 – BigShiba

+0

錯誤發生時'fn'的值是多少?它是'path'的子目錄嗎? – MattDMo

回答

0

os.listdir(),顧名思義,返回給定目錄的所有乘客的名單,包括文件和目錄(如果你是在Unix/Linux,其他的東西像符號連接和設備和諸如此類的東西)。您隨後一味地嘗試open()列表中的每個項目和print()其內容。不幸的是,open()只適用於類似文件的對象,並且而不是工作在目錄上,因此Errno 13,權限被拒絕。

另一種方法是使用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參數的傳遞給os.listdir()在你的原代碼,並entry.name以上,然後,使用with上下文管理,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() 

否則,你有一個黨ling文件句柄,可能可能會導致問題,具體取決於有多少和你已經做了什麼。 close()open()只是一個很好的做法。使用with,您不必擔心 - 只要退出該塊,文件句柄就會關閉。

相關問題