2011-12-28 42 views
5

Sử dụng Python3, hy vọng os.walk một thư mục tệp, đọc chúng thành đối tượng nhị phân (chuỗi?) Và thực hiện thêm một số thao tác trên chúng. Bước đầu tiên, mặc dù: Làm thế nào để đọc các tập tin (s) kết quả của os.walk?Cách đọc nội dung tập tin từ một tập tin?

# 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) 

LỖI:

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 

Trả lời

9

Để đọc một tập tin nhị phân, bạn phải mở file trong chế độ nhị phân. Thay đổi

input = open(fullpath, "r") 

để

input = open(fullpath, "rb") 

Kết quả của read() sẽ là một byte() đối tượng.

+0

Tks, Lennart - Vâng, đây là nước sốt bí mật tôi cần. Kinda mới với Python3! – DrLou

+0

Nó không thực sự Python 3 cụ thể. Các tệp nhị phân sẽ được mở bằng cờ 'b' trong Python 2. –

+1

Vâng, tất cả dường như hơi câm với tôi khi nhìn lại - nhưng đây là cách chúng tôi ngốc nghếch học hỏi! Có lẽ bạn đang nghĩ: RTFM! Cảm ơn một lần nữa để được giúp đỡ. – DrLou

3

Vì một số tệp của bạn là nhị phân, chúng không thể được giải mã thành công thành các ký tự unicode mà Python 3 sử dụng để lưu trữ tất cả các chuỗi trong trình thông dịch. Lưu ý rằng sự thay đổi lớn giữa Python 2 và Python 3 liên quan đến việc di chuyển biểu diễn các chuỗi thành các ký tự unicode từ ASCII, nghĩa là mỗi ký tự không thể được coi như một byte (có, chuỗi văn bản trong Python 3 yêu cầu 2x hoặc 4x nhiều bộ nhớ để lưu trữ dưới dạng Python 2, vì UTF-8 sử dụng tối đa 4 byte cho mỗi ký tự).

Bạn nên có một số tùy chọn mà sẽ phụ thuộc vào dự án của bạn:

  • Bỏ qua tập tin nhị phân, lọc theo phần mở rộng tập tin,
  • đọc các tập tin nhị phân và một trong hai bắt ngoại lệ giải mã nếu và khi nó xảy ra và bỏ qua tệp hoặc sử dụng một trong các phương pháp được mô tả trong chủ đề này How can I detect if a file is binary (non-text) in python?

Trong tĩnh mạch này, bạn có thể chỉnh sửa giải pháp của mình chỉ cần nắm bắt lỗi UnicodeDecode và bỏ qua tệp.

Bất kể quyết định của bạn, điều quan trọng cần lưu ý là nếu có nhiều loại mã hóa ký tự khác nhau trong các tệp trên hệ thống của bạn, bạn sẽ cần phải xác định mã hóa như Python 3.0 sẽ giả định các ký tự được mã hóa trong UTF -số 8.

Là một tài liệu tham khảo, một bài thuyết trình tuyệt vời về Python 3 I/O: http://www.dabeaz.com/python3io/MasteringIO.pdf

+0

Cảm ơn bạn đã liên kết này và nhận xét của bạn - những điều này sẽ rất hữu ích trong quá trình học tập của tôi. Cho đến nay, ít nhất, tất cả các tệp có vẻ dễ đọc như nhị phân. – DrLou

Các vấn đề liên quan