Chào. tôi có một câu hỏi thực sự cơ bản [rất mới đối với python]. làm cách nào để đọc toàn bộ tệp nhị phân? . //www. nhà phát triển. com/content/working-binary-data-python ,
while True:
data = binary_file.read[]
if not data:
break
#return hex rep and write
3 là đọc toàn bộ tệp cùng một lúc. vì vậy tôi có một. dng để kiểm tra, đó là 16. 2mb, và tôi đã làmwith open["portrait1.dng", "rb"] as binary_file:
#Read the whole file at once
data = binary_file.read[]
#Return the hexadecimal representation of the binary data, byte instance
hexa = binascii.hexlify[data]
with open["readprotrait1.raw", "wb"] as write_file:
write_file.write[hexa]
tôi đang sử dụng trình soạn thảo hex để xem liệu dữ liệu từ. dng được sao chép vào. tệp thô nhưng chỉ một phần của nó được sao chép. kết quả tương tự xảy ra khi tôi sử dụng vòng lặp
while True:
data = binary_file.read[]
if not data:
break
#return hex rep and write
4 nhưwhile True:
data = binary_file.read[]
if not data:
break
#return hex rep and write
nếu tôi đặt kích thước [1024] trong
while True:
data = binary_file.read[]
if not data:
break
#return hex rep and write
5, chỉ một vài dòng cuối cùng của dữ liệu được ghi. vậy nó có thực sự đọc toàn bộ tệp không và tại phần "ghi" là nơi nó trở nên phức tạp [không ghi hoàn chỉnh]? con trăn
0 0
Chia sẻ
- 2 Người đóng góp
- 2 Trả lời
- 53K Lượt xem
- 3 giờ Khoảng thời gian thảo luận
- Bài đăng mới nhất 4 năm trước Bài đăng mới nhất của Gribouillis
Câu trả lời được đề xuất
Đã trả lời bởi Gribouillis 1.391 trong một bài đăng từ 4 năm trước
Chuyển tới bài viếtĐọc tệp theo khối và cũng viết khối
with open["portrait1.dng", "rb"] as binaryfile : with open["readfile.raw", "wb"] as newFile: while True: chunk = binaryfile.read[4096] if not chunk: break newFile.write[binascii.hexlify[chunk]]
toàn bộ cuộc sống đại học của tôi là về điều này [bản dịch, nếu nó chết tôi chết]
Bảo đảm …
Tất cả 2 câu trả lời
nadiam 0 Đăng bài chuyên nghiệp trong đào tạo Được chứ. Tôi vừa tìm thấy
0 đã hoàn thành mục tiêu của mình bằng cáchwhile True:
data = binary_file.read[]
if not data:
break
#return hex rep and write
with open["portrait1.dng", "rb"] as binaryfile :
myArr = bytearray[binaryfile.read[]]
with open["readfile.raw", "wb"] as newFile:
newFile.write[myArr]
nhưng các câu hỏi của tôi vẫn còn nhiều vấn đề vì như tôi đã đề cập, tệp hiện tại tôi đang kiểm tra chỉ là 16. 2mb và tệp thực sẽ được sử dụng là 8gb và tôi đã kiểm tra mã này với tệp khổng lồ đó và máy tính xách tay của tôi bị treo. vì vậy một vài câu hỏi/suy nghĩ được cập nhật
đọc và ghi rõ ràng là hoạt động nhưng thao tác nào sử dụng nhiều RAM nhất? . có cách nào để giảm tải đó không? . toàn bộ cuộc sống đại học của tôi là về điều này [bản dịch, nếu nó chết tôi chết]
Tuy nhiên, tốt hơn là liên kết đối tượng tệp với một biến để bạn có thể gọi
6 trên đó ngay khi hoàn tất. Ví dụ, đối với một tệp văn bảnwhile True: data = binary_file.read[] if not data: break #return hex rep and write
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]
Có bốn cách để đọc nội dung của tệp văn bản cùng một lúc dưới dạng danh sách các chuỗi, mỗi chuỗi một dòng
list_of_all_the_lines = file_object.readlines[ ] list_of_all_the_lines = file_object.read[ ].splitlines[1] list_of_all_the_lines = file_object.read[].splitlines[ ] list_of_all_the_lines = file_object.read[ ].split['\n']
Hai cách đầu tiên để lại một
7 ở cuối mỗi dòng [i. e. , trong mỗi mục chuỗi trong danh sách kết quả], trong khi hai cách còn lại loại bỏ tất cả các ký tựwhile True: data = binary_file.read[] if not data: break #return hex rep and write
7 ở cuối. Cách đầu tiên trong bốn cách này là cách nhanh nhất và Pythonic nhất. Trong Python 2. 2 trở về sau có cách thứ 5 tương đương với cách thứ nhấtwhile True: data = binary_file.read[] if not data: break #return hex rep and write
list_of_all_the_lines = list[file_object]
Trừ khi tệp bạn đang đọc thực sự lớn, còn không thì việc đưa tất cả vào bộ nhớ trong một lần nhấp là cách nhanh nhất và nói chung là thuận tiện nhất cho bất kỳ quá trình xử lý tiếp theo nào. Hàm tích hợp sẵn
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]0 tạo đối tượng tệp Python. Với đối tượng đó, bạn gọi phương thức
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]1 để lấy tất cả nội dung [dù là văn bản hay nhị phân] dưới dạng một chuỗi lớn duy nhất. Nếu nội dung là văn bản, bạn có thể chọn tách ngay chuỗi đó thành một danh sách các dòng, bằng phương thức
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]2 hoặc bằng phương thức chuyên biệt
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]3. Vì việc chia tách như vậy là một nhu cầu thường xuyên, bạn cũng có thể gọi trực tiếp
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]4 trên đối tượng tệp, để thao tác nhanh hơn và thuận tiện hơn một chút. Trong Python 2. 2, bạn cũng có thể chuyển đối tượng tệp trực tiếp dưới dạng đối số duy nhất cho loại tích hợp sẵn
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]5
Trên các hệ thống tương tự Unix và Unix, chẳng hạn như các biến thể Linux và BSD, không có sự phân biệt thực sự giữa tệp văn bản và tệp dữ liệu nhị phân. Tuy nhiên, trên các hệ thống Windows và Macintosh, các dấu kết thúc dòng trong tệp văn bản không được mã hóa bằng dấu phân cách
while True:
data = binary_file.read[]
if not data:
break
#return hex rep and write
7 tiêu chuẩn, mà bằng file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]7 và
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]8, tương ứng. Python thay mặt bạn dịch các ký tự kết thúc dòng thành
while True:
data = binary_file.read[]
if not data:
break
#return hex rep and write
7, nhưng điều này có nghĩa là bạn cần thông báo cho Python khi mở tệp nhị phân để nó không thực hiện dịch. Để làm điều đó, hãy sử dụng list_of_all_the_lines = file_object.readlines[ ] list_of_all_the_lines = file_object.read[ ].splitlines[1] list_of_all_the_lines = file_object.read[].splitlines[ ] list_of_all_the_lines = file_object.read[ ].split['\n']0 làm đối số thứ hai cho
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]0. Điều này là vô hại ngay cả trên các nền tảng giống Unix và ngay cả ở đó, đó là một thói quen tốt để phân biệt tệp nhị phân với tệp văn bản, mặc dù điều đó không bắt buộc trong trường hợp đó. Một thói quen tốt như vậy sẽ làm cho chương trình của bạn dễ hiểu hơn, cũng như cho phép bạn di chuyển chúng giữa các nền tảng dễ dàng hơn
Bạn có thể gọi các phương thức như
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]1 trực tiếp trên đối tượng tệp do hàm
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]0 tạo ra, như được hiển thị trong đoạn mã đầu tiên của giải pháp. Khi bạn thực hiện việc này, ngay sau khi thao tác đọc kết thúc, bạn không còn tham chiếu đến đối tượng tệp nữa. Trong thực tế, Python nhận thấy thiếu tham chiếu ngay lập tức và ngay lập tức đóng tệp. Tuy nhiên, tốt hơn là gắn một tên với kết quả của
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]0, để bạn có thể tự gọi
while True:
data = binary_file.read[]
if not data:
break
#return hex rep and write
6 một cách rõ ràng khi hoàn thành tệp. Điều này đảm bảo rằng tệp luôn mở trong thời gian ngắn nhất có thể, ngay cả trên các nền tảng như Jython và các phiên bản tương lai giả định của Python trên đó các cơ chế thu gom rác tiên tiến hơn có thể trì hoãn việc đóng tự động mà Python thực hiệnNếu bạn chọn đọc từng tệp một, thay vì đọc tất cả cùng một lúc, các thành ngữ sẽ khác. Đây là cách đọc tệp nhị phân 100 byte mỗi lần, cho đến khi bạn đọc đến cuối tệp
with open["portrait1.dng", "rb"] as binaryfile :
with open["readfile.raw", "wb"] as newFile:
while True:
chunk = binaryfile.read[4096]
if not chunk:
break
newFile.write[binascii.hexlify[chunk]]
1Truyền một đối số
list_of_all_the_lines = file_object.readlines[ ] list_of_all_the_lines = file_object.read[ ].splitlines[1] list_of_all_the_lines = file_object.read[].splitlines[ ] list_of_all_the_lines = file_object.read[ ].split['\n']6 cho phương thức
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]1 đảm bảo rằng
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]1 sẽ chỉ đọc các byte tiếp theo của
list_of_all_the_lines = file_object.readlines[ ] list_of_all_the_lines = file_object.read[ ].splitlines[1] list_of_all_the_lines = file_object.read[].splitlines[ ] list_of_all_the_lines = file_object.read[ ].split['\n']6 [hoặc ít hơn, nếu tệp gần cuối].
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]1 trả về chuỗi trống khi đến cuối tệp
Đọc một tệp văn bản một dòng tại một thời điểm là một nhiệm vụ thường xuyên. Trong Python 2. 2 trở lên, đây là cách tiếp cận dễ nhất, rõ ràng nhất và nhanh nhất
with open["portrait1.dng", "rb"] as binaryfile :
with open["readfile.raw", "wb"] as newFile:
while True:
chunk = binaryfile.read[4096]
if not chunk:
break
newFile.write[binascii.hexlify[chunk]]
7Một số thành ngữ phổ biến trong các phiên bản Python cũ hơn. Một thành ngữ mà bạn có thể chắc chắn sẽ hoạt động ngay cả trên các phiên bản Python cực kỳ cũ, chẳng hạn như 1. 5. 2, khá giống với thành ngữ để đọc một tệp nhị phân một đoạn tại một thời điểm
with open["portrait1.dng", "rb"] as binaryfile :
with open["readfile.raw", "wb"] as newFile:
while True:
chunk = binaryfile.read[4096]
if not chunk:
break
newFile.write[binascii.hexlify[chunk]]
8list_of_all_the_lines = list[file_object]1, giống như
file_object = open['thefile.txt'] all_the_text = file_object.read[ ] file_object.close[ ]1, trả về chuỗi trống khi đến cuối tệp. Lưu ý rằng phần cuối của tệp có thể dễ dàng phân biệt với một dòng trống vì dòng sau được trả về bởi
list_of_all_the_lines = list[file_object]1 là
while True:
data = binary_file.read[]
if not data:
break
#return hex rep and write
7, đây không phải là một chuỗi trống mà là một chuỗi có độ dài 1công thức 4. 3;