2015-04-02 72 views
1

嘗試提取所有壓縮文件併爲所有文件所在的文件夾提供相同的名稱。 循環瀏覽文件夾中的所有文件,然後遍歷這些文件中的行以寫入不同的文本文件。
這是到目前爲止我的代碼:Python文件-IO和zipfile。嘗試遍歷文件夾中的所有文件,然後使用Python循環遍歷各個文件中的文本

#!usr/bin/env python3 
import glob 
import os 
import zipfile 

zip_files = glob.glob('*.zip') 
for zip_filename in zip_files: 
    dir_name = os.path.splitext(zip_filename)[0] 
    os.mkdir(dir_name) 
    zip_handler = zipfile.ZipFile(zip_filename, "r") 
    zip_handler.extractall(dir_name) 

path = dir_name 
fOut = open("Output.txt", "w") 

for filename in os.listdir(path): 
    for line in filename.read().splitlines(): 
     print(line) 
     fOut.write(line + "\n") 
fOut.close() 

這是我遇到的錯誤:

for line in filename.read().splitlines(): 
AttributeError: 'str' object has no attribute 'read' 
+0

'filename'是一個字符串。而不是'read()'字符串,你需要打開文件然後閱讀它。 – axblount 2015-04-02 17:25:05

回答

1

您需要打開該文件,並且還加入了文件的路徑,也使用splitlines和然後添加一個新行每行是有點多餘:

path = dir_name 
with open("Output.txt", "w") as fOut:  
    for filename in os.listdir(path): 
     # join filename to path to avoid file not being found 
     with open(os.path.join(path, filename)): 
      for line in filename: 
       fOut.write(line) 

你應該總是使用with打開你的文件,因爲它會關閉它們自動。如果文件不大,你可以簡單地fOut.write(f.read())並刪除循環。

您還設置了path = dir_name這意味着路徑將被設置爲dir_name的最後一個值在您的第一個循環中,這可能是也可能不是您想要的。您也可以使用iglob來避免創建完整列表zip_files = glob.iglob('*.zip')

+0

你是上帝!非常感謝你。奇蹟般有效。 – 2015-04-02 17:10:57

+0

不用擔心,只要確保'dir_name'就是您認爲的那樣。 – 2015-04-02 17:12:03

+0

事情是這樣的,我已經有了python的零經驗。我這樣做是爲了編程語言課的調查。我只有一週的時間,我正在努力尋找幫助。 – 2015-04-02 17:18:07