Cách đúng để tải văn bản unicode từ Python 2.7 là một cái gì đó như:Làm cách nào để giải mã unicode một dòng tại một thời điểm trong Python 2.7?
content = open('filename').read().decode('encoding'):
for line in content.splitlines():
process(line)
(Cập nhật: Không có nó không phải là Xem câu trả lời..)
Tuy nhiên, nếu tập tin là rất lớn, tôi có thể muốn đọc, giải mã và xử lý nó một dòng tại một thời điểm, để toàn bộ tập tin không bao giờ được nạp vào bộ nhớ cùng một lúc. Một cái gì đó như:
for line in open('filename'):
process(line.decode('encoding'))
Lặp lại vòng lặp qua tệp mở là bộ tạo mỗi lần đọc một dòng.
này không hoạt động mặc dù, bởi vì nếu tập tin được mã hóa utf32, ví dụ, sau đó các byte trong file (trong hex) giống như thế:
hello\n = 68000000(h) 65000000(e) 6c000000(l) 6c000000(l) 6f000000(o) 0a000000(\n)
Và chia thành dây chuyền thực hiện bằng cách các for
vòng chia trên 0a
byte của nhân vật \n
, kết quả (trong hex):
lines[0] = 0x 68000000 65000000 6c000000 6c000000 6f000000 0a
lines[1] = 0x 000000
Vì vậy, một phần của nhân vật \n
còn lại ở phần cuối của dòng 1, và ba byte còn lại kết thúc trong dòng 2 (theo sau là bất kỳ văn bản nào thực sự nằm trong dòng 2.) Gọi số decode
trên một trong hai dòng này có thể dễ dàng dẫn đến kết quả là UnicodeDecodeError
.
UnicodeDecodeError: 'utf32' codec can't decode byte 0x0a in position 24: truncated data
Vì vậy, rõ ràng là đủ, tách luồng byte unicode trên 0a
byte không phải là cách chính xác để chia thành dòng. Thay vào đó, tôi nên chia nhỏ các lần xuất hiện của ký tự dòng mới bốn byte đầy đủ (0x0a000000). Tuy nhiên, tôi nghĩ cách chính xác để phát hiện các ký tự này là giải mã luồng byte thành chuỗi unicode và tìm kiếm các ký tự \n
- và giải mã toàn bộ luồng này chính xác là hoạt động tôi đang cố tránh.
Đây không phải là yêu cầu không phổ biến. Cách chính xác để xử lý nó là gì?
Bạn đã thử đọc tệp bằng phương thức codecs.open() chưa? –
@Maulwurfn, tôi không biết nó tồn tại! Nhưng tôi làm bây giờ. Cảm ơn. –