2012-03-28 122 views
4

隨着下面的代碼我接收IOError: [Errno 13] Permission denied,我知道這是由於輸出目錄是輸入目錄的子文件夾中:Python的IO錯誤:[錯誤13]權限被拒絕

import datetime 
import os 

inputdir = "C:\\temp2\\CSV\\" 
outputdir = "C:\\temp2\\CSV\\output\\" 
keyword = "KEYWORD" 

for path, dirs, files in os.walk(os.path.abspath(inputdir)): 
    for f in os.listdir(inputdir): 
     file_path = os.path.join(inputdir, f) 
     out_file = os.path.join(outputdir, f) 
     with open(file_path, "r") as fh, open(out_file, "w") as fo: 
      for line in fh: 
       if keyword not in line: 
        fo.write(line) 

然而,當我將輸出文件夾更改爲:outputdir = "C:\\temp2\\output\\"代碼成功運行。我希望能夠將修改後的文件寫入輸入目錄的子文件夾。我如何做到這一點,而沒有得到'權限被拒絕'的錯誤? tempfile模塊在這種情況下會有用嗎?

+0

你有權限寫在那裏嗎?我個人會使用'tempfile',因爲它更乾淨。 – Blender 2012-03-28 04:06:47

+0

你可以把fh寫成可寫嗎? – tartar 2012-03-28 04:06:51

+0

作爲旁註,如果使用原始字符串,則不需要雙反斜槓。例如:'r「C:\ Temp1 \ CSV \ Output \」'與'「C:\\ Temp1 \ CSV \\ Output \\」'。 – 2012-03-28 05:30:56

回答

1

os.listdir將返回目錄以及文件名。 outputinputdir之內,所以with正在嘗試打開一個讀/寫目錄。

你究竟想要做什麼? path, dirs, files甚至沒有用於遞歸os.walk

編輯:我認爲你在尋找這樣的事情:

import os 

INPUTDIR= "c:\\temp2\\CSV" 
OUTPUTDIR = "c:\\temp2\\CSV\\output" 
keyword = "KEYWORD" 

def make_path(p): 
    '''Makes sure directory components of p exist.''' 
    try: 
     os.makedirs(p) 
    except OSError: 
     pass 

def dest_path(p): 
    '''Determines relative path of p to INPUTDIR, 
     and generates a matching path on OUTPUTDIR. 
    ''' 
    path = os.path.relpath(p,INPUTDIR) 
    return os.path.join(OUTPUTDIR,path) 

make_path(OUTPUTDIR) 

for path, dirs, files in os.walk(INPUTDIR): 
    for d in dirs: 
     dir_path = os.path.join(path,d) 
     # Handle case of OUTPUTDIR inside INPUTDIR 
     if dir_path == OUTPUTDIR: 
      dirs.remove(d) 
      continue 
     make_path(dest_path(dir_path))  
    for f in files: 
     file_path = os.path.join(path, f) 
     out_path = dest_path(file_path) 
     with open(file_path, "r") as fh, open(out_path, "w") as fo: 
      for line in fh: 
       if keyword not in line: 
        fo.write(line) 
+0

對不起,我對Python還是比較新的。目前我只有一個我想要處理的CSV文件的平面目錄 - 刪除行並將修改的CSV文件保存到輸入文件夾中的輸出文件夾。但是,我可能會有一段時間需要處理CSV文件的文件夾/子文件夾,所以我想確保我也可以處理這種情況。 – Keith 2012-03-28 04:14:49

+1

在同時修改目錄的同時遞歸目錄會使事情變得複雜。可以通過修改'dirs'並在看到輸出目錄時刪除輸出目錄來完成,但更簡單的方法是將輸出目錄保留在輸入目錄之外。 你實際上並不需要'os.listdir'。 'file for f'和'file_path = os.path.join(path,f)'將在輸入目錄下遞歸地給你每個文件的完整路徑。 – 2012-03-28 04:27:45

+0

感謝您的反饋,Mark。我會研究你的建議。我同意將輸出目錄保留在輸入目錄之外更簡單,但是,我的團隊中將使用此工具的其他人員將使用我創建的此工具,並希望在輸入目錄中具有輸出目錄。我已經使用PowerShell完成了這個任務(似乎沒有這些複雜性),但我想利用Python的文本處理能力。在某些情況下,我將在CSV文件中處理數百萬行文件,並且需要一個更強大的工具來處理這項工作。 – Keith 2012-03-28 04:48:25

1

如果你成功地輸入遍歷目錄之外寫入到輸出目錄,然後寫在那兒首先使用與上面相同的代碼,然後將其移至輸入目錄中的子目錄。你可以使用os.move

+0

嗨Senthil,我真的想過使用'os.move',但不知道這種方法效率會不高。我可以試一試... – Keith 2012-03-28 05:30:43

+0

Hi Keith,這不是那麼低效,這是一個很好的方法。事實上,寫到你的閱讀地點以外的地方會更好。然後你可以自動地移動到最終目的地。 – 2012-03-28 05:31:59

+0

啊......很高興知道。謝謝你的反饋,Senthil。我會試一試。 – Keith 2012-03-28 05:40:19

相關問題