2011-12-28 23 views
5

Korzystając z Python3, należy liczyć się z os.walk katalogiem plików, przeczytać je w obiekcie binarnym (ciąg znaków?) I wykonać na nich dalsze przetwarzanie. Najpierw jednak: Jak odczytać plik (i) wyniki os.walk?Jak odczytać zawartość pliku z pliku?

# NOTE: Execute with python3.2.2 

import os 
import sys 

path = "/home/user/my-files" 

count = 0 
successcount = 0 
errorcount = 0 
i = 0 

#for directory in dirs 
for (root, dirs, files) in os.walk(path): 
# print (path) 
print (dirs) 
#print (files) 

for file in files: 

    base, ext = os.path.splitext(file) 
    fullpath = os.path.join(root, file) 

    # Read the file into binary? -------- 
    input = open(fullpath, "r") 
    content = input.read() 
    length = len(content) 
    count += 1 
    print (" file: ---->",base,"/",ext," [count:",count,"]", "[length:",length,"]") 
    print ("fullpath: ---->",fullpath) 

BŁĄD:

Traceback (most recent call last): 
    File "myFileReader.py", line 41, in <module> 
    content = input.read() 
    File "/usr/lib/python3.2/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 11: invalid continuation byte 

Odpowiedz

9

Aby odczytać plik binarny należy otworzyć plik w trybie binarnym. Zmień

input = open(fullpath, "r") 

do

input = open(fullpath, "rb") 

wynikiem read() będzie bajtów() obiektu.

+0

TKS Lennart - tak, to był tajny sos potrzebne. Kinda new to Python3! – DrLou

+0

To nie jest właściwie Python, który jest 3 specyficzny. Pliki binarne powinny być również otwarte z flagą "b" w Pythonie 2. –

+1

Tak, to wszystko wydaje mi się nieco głupie z perspektywy czasu - ale tak się uczymy! Prawdopodobnie myślisz: RTFM! Jeszcze raz dziękuję za pomoc. – DrLou

3

Ponieważ niektóre pliki są binarne, nie można ich pomyślnie odszyfrować w znaki Unicode, których Python 3 używa do przechowywania wszystkich ciągów znaków w interpretera. Zauważ, że duża zmiana między Python 2 i Python 3 wymaga migracji reprezentacji ciągów znaków do znaków Unicode z ASCII, co oznacza, że ​​każdy znak nie może być po prostu traktowany jako bajt (tak, ciągi tekstowe w Pythonie 3 wymagają 2x lub 4x tyle pamięci do zapisania, co Python 2, ponieważ UTF-8 używa do 4 bajtów na znak).

można więc mieć wiele opcji, które będą zależały od projektu:

w tym duchu można edytować swoje rozwiązanie po prostu złapać błąd UnicodeDecode i pominąć ten plik.

Bez względu na swoją decyzję, ważne jest, aby pamiętać, że jeśli istnieje szeroki zakres różnych kodowań znaków w plikach w twoim systemie, będziesz musiał określić kodowanie, ponieważ Python 3.0 zakłada, że ​​znaki są zakodowane w UTF -8.

Jako punkt odniesienia, wielka prezentacja na Pythonie 3 I/O: http://www.dabeaz.com/python3io/MasteringIO.pdf

+0

Dzięki za ten link i za komentarze - będą one bardzo przydatne w moim procesie uczenia się. Do tej pory wszystkie pliki wydają się łatwe do odczytania jako pliki binarne. – DrLou

Powiązane problemy