2012-01-30 23 views
6

Các mã sau đây, thực hiện trong python 2.7.2 trên cửa sổ, chỉ đọc trong một phần nhỏ của tập tin cơ bản:Python: Tệp không đọc toàn bộ tệp, io.FileIO làm - tại sao?

import os 

in_file = open(os.path.join(settings.BASEPATH,'CompanyName.docx')) 
incontent = in_file.read() 
in_file.close() 

trong khi mã này chỉ hoạt động tốt:

import io 
import os 

in_file = io.FileIO(os.path.join(settings.BASEPATH,'CompanyName.docx')) 
incontent = in_file.read() 
in_file.close() 

Tại sao Sự khác biệt? Từ đọc tài liệu của tôi, họ nên thực hiện giống hệt nhau.

+0

Có thể liên quan đến mã hóa, có thể bạn đang mở tệp bằng cài đặt mặc định, mở() mặc định là 'r', thử mở (tên tệp, 'rb') để buộc chế độ nhị phân. – synthesizerpatel

Trả lời

12

Bạn cần mở tệp ở chế độ nhị phân hoặc read() sẽ dừng lại ở ký tự EOF đầu tiên mà nó tìm thấy. Và docx là một tệp ZIP được bảo đảm chứa một ký tự như vậy ở đâu đó.

Hãy thử

in_file = open(os.path.join(settings.BASEPATH,'CompanyName.docx'), "rb") 

FileIO đọc raw bytestreams và những người đang "nhị phân" theo mặc định.

+0

Wow! Nguyên nhân gốc rễ của cái gì đó cơ bản trong cách Windows xử lý các tệp? – Marcin

+0

@Marcin đó là thêm về định dạng tệp docx MS Word. nếu bạn chỉ muốn đọc một .txt, 'open()' sẽ hoạt động tốt. –

+3

+1. Như tài liệu Python 2.7, [7.2. * Đọc và Viết tập tin *], nói: "Python trên Windows phân biệt giữa văn bản và tệp nhị phân, ký tự cuối dòng trong tệp văn bản được tự động thay đổi một chút khi dữ liệu được đọc hoặc ghi. sửa đổi ... [sẽ] ... làm hỏng dữ liệu nhị phân giống như trong các tệp 'JPEG' hoặc' EXE'. Hãy cẩn thận khi sử dụng chế độ nhị phân khi đọc và ghi các tệp đó. Trên Unix, nó không gây tổn thương để nối thêm ''b'' vào chế độ, vì vậy bạn có thể sử dụng nó độc lập với nền tảng cho tất cả các tệp nhị phân." –

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