2013-05-14 26 views
7

Tôi đọc trên Python hướng dẫn: (http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files)Python có nguy hiểm đối với các tệp nhị phân không?

Python trên Windows tạo ra một sự khác biệt giữa văn bản và tập tin nhị phân; các ký tự cuối dòng trong các tệp văn bản được tự động thay đổi một chút khi dữ liệu được đọc hoặc ghi. Việc sửa đổi hậu trường này thành tệp dữ liệu là tốt cho các tệp văn bản ASCII, nhưng nó sẽ làm hỏng dữ liệu nhị phân như vậy trong các tệp JPEG hoặc EXE. Hãy rất cẩn thận khi sử dụng chế độ nhị phân khi đọc và ghi các tệp như vậy.

Tôi không hiểu cách 'các ký tự cuối dòng trong tệp văn bản bị thay đổi' sẽ 'làm hỏng dữ liệu nhị phân'. Bởi vì tôi cảm thấy dữ liệu nhị phân không có những thứ như cuối dòng.

Ai đó có thể giải thích thêm về đoạn này cho tôi không? Nó làm cho tôi cảm thấy như Python không chào đón các tập tin nhị phân.

+4

Nó đọc "Hãy rất cẩn thận ** để ** sử dụng chế độ nhị phân ...", không phải "Hãy rất cẩn thận ** khi bạn ** sử dụng chế độ nhị phân ...". Chế độ nhị phân là an toàn. – Matthias

Trả lời

14

Bạn chỉ cần cẩn thận để mở tệp trên cửa sổ dưới dạng nhị phân (open(filename, "rb")) và không phải dưới dạng tệp văn bản. Sau đó không có vấn đề gì khi sử dụng dữ liệu.

Riêng dòng cuối cùng trên Windows là '\r\n'. Và nếu bạn đọc một tệp nhị phân dưới dạng tệp văn bản và viết nó trở lại, thì '\n' được chuyển đổi thành chuỗi '\r\n'. Nếu bạn mở các tệp dưới dạng nhị phân (để đọc và viết) thì có số vấn đề như vậy.

Python có khả năng xử lý dữ liệu nhị phân và bạn phải thực hiện loại chăm sóc này bằng bất kỳ ngôn ngữ nào trên hệ thống cửa sổ, không chỉ bằng Python (nhưng nhà phát triển Python đủ thân thiện để cảnh báo bạn về hệ điều hành có thể có) các vấn đề). Trong các hệ thống như Linux, nơi kết thúc dòng là một ký tự, sự khác biệt này tồn tại, nhưng ít có khả năng gây ra vấn đề khi đọc/ghi dữ liệu nhị phân dưới dạng văn bản (nghĩa là không có tùy chọn b để mở tệp).

+0

OK. Python (và một số ngôn ngữ khác) đối phó với các ký tự đặc biệt (cuối dòng) đằng sau hiện trường khi sử dụng 'r'. Vì vậy, nó sai lầm khi sử dụng chế độ văn bản để xử lý tệp nhị phân. –

2

Tôi cảm thấy dữ liệu nhị phân không có những thứ như cuối dòng.

Tệp nhị phân có thể có bất kỳ ký tự nào có thể có trong đó, kể cả ký tự \ n. Bạn không muốn python ngầm chuyển đổi bất kỳ ký tự nào trong một tệp nhị phân sang một tệp khác. Python không có ý tưởng nó đang đọc một tập tin nhị phân, trừ khi bạn nói với nó như vậy. Và khi python đọc một tệp văn bản, nó sẽ tự động chuyển đổi bất kỳ ký tự \ n nào thành ký tự dòng mới của hệ điều hành, mà trên Windows là \ r \ n.

Đó là cách mọi thứ hoạt động trong tất cả các ngôn ngữ lập trình máy tính.

Một cách khác để suy nghĩ về nó là: một tệp chỉ là một chuỗi dài các byte (8 bit). Một byte chỉ là một số nguyên. Và một byte có thể là bất kỳ số nguyên nào. Nếu một byte xảy ra là số nguyên 10, đó cũng là mã ascii cho ký tự \ n. Nếu các byte trong tệp đại diện cho dữ liệu nhị phân, bạn không muốn Python đọc trong 10 và chuyển đổi nó thành hai byte: 13 và 10. Thông thường khi bạn đọc dữ liệu nhị phân, bạn muốn đọc, nói, 2 byte đầu tiên đại diện cho một số, sau đó 4 byte tiếp theo đại diện cho một số khác, vv. Rõ ràng, nếu python đột nhiên chuyển đổi một byte thành hai byte, điều đó sẽ gây ra hai vấn đề: 1) Nó làm thay đổi dữ liệu, 2) Tất cả các ranh giới dữ liệu của bạn sẽ bị rối tung lên.

Ví dụ: giả sử byte đầu tiên của tệp được giả định đại diện cho trọng lượng của chó và giá trị của byte là 10. Sau đó byte tiếp theo được giả định đại diện cho tuổi của chó và giá trị của nó là 1. Nếu Python chuyển đổi 10, đó là mã ascii cho \ n, để hai byte: 10 và 13, sau đó tay dữ liệu python bạn sẽ trông giống như:

và khi bạn trích xuất các byte thứ hai cho tuổi của chó, bạn nhận được 13 - không 1.

Chúng tôi thường nói một tệp có chứa 'ký tự' nhưng điều đó là sai. Máy tính không thể lưu trữ các ký tự; họ chỉ có thể lưu trữ số. Vì vậy, một tập tin chỉ là một chuỗi dài các số. Nếu bạn nói với python để xử lý những con số như mã ascii, đại diện cho các ký tự, sau đó python sẽ cung cấp cho bạn văn bản.

1

Tôi cho rằng "hơi thay đổi" trong hướng dẫn sử dụng Python có nghĩa là các ký tự cuối dòng Unix chuyển đổi thành các ký tự cuối dòng Windows. Bởi vì điều này được thực hiện chỉ trong Windows, do đó, Unix và Linux không có rắc rối này.