2012-08-31 40 views
0

在SO成員的幫助下,我能夠達到如下,以下是示例代碼,目的是將來自給定文件夾和它的子文件夾的文本文件合併到將輸出存儲爲master.txt。但我偶爾會得到回溯,看起來像讀取文件時會拋出錯誤。Python 3:處理二進制模式中的剝離行

考慮到建議,輸入和一些研究,它是一個好主意,清理統一的unicode文本文件或採用一些逐行功能,所以閱讀每行應裁剪垃圾字符和空行。

import shutil 
import os.path 

root = 'C:\\Dropbox\\test\\' 
files = [(path,f) for path,_,file_list in os.walk(root) for f in file_list] 

with open('C:\\Dropbox\\Python\\master.txt','wb') as output: 
    for path, f_name in files: 
     with open(os.path.join(path, f_name), 'rb') as input: 
      shutil.copyfileobj(input, output) 
     output.write(b'\n') # insert extra newline 

with open('master.txt', 'r') as f: 
    lines = f.readlines() 
with open('master.txt', 'w') as f: 
    f.write("".join(L for L in lines if L.strip())) 

回溯我得到:

Traceback (most recent call last): 
    File "C:\Dropbox\Python\master1.py", line 14, in <module> 
    lines = f.readlines() 
    File "C:\PYTHON32\LIB\encodings\cp1252.py", line 23, in decode 
    return codecs.charmap_decode(input,self.errors,decoding_table)[0] 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 8159: character maps to <undefined> 
+0

那麼...又是什麼問題? –

+0

@ ignacio-vazquez-abrams什麼可以使Traceback消失。 – user1582596

回答

2

你在文本模式下打開master.txt。當你從它讀取數據()時,它將使用系統的默認編碼解碼它們。顯然,該文件是在另一個解碼,因爲你得到一個UnicodeDecodeError。

以二進制模式打開文件,或指定正確的編碼。

+0

10倍,我的文本文件本質上很簡單,有時我使用複製粘貼,這是搞砸了事情。我對編碼沒有任何偏好。是否有任何快速清理文本文件的方法,以便所有文本文件都具有統一的編碼。或者如果在閱讀該行時可以進行清理。 – user1582596

+0

@ user1582596:要進行統一編碼,您必須逐個更改文件上的編碼。一種方法是使用chardet庫(http://pypi.python.org/pypi/chardet)來猜測編碼。但在你做之前:你確定這些文件有不同的編碼? –

+0

我在win7-64上使用了Notepad ++來創建這個文件,沒有任何顯式的編碼設置。可能這種差異來自複製粘貼。如果我能從traceback知道文件引用。可能是我可以重溫並嘗試糾正。正如你所看到的,在回溯引用中沒有對我的文本文件的引用。這就是爲什麼我成爲了一個展示塞。 – user1582596

相關問題