Làm thế nào để xử lý đúng nhiều tệp nhị phân trong python?


10

Tôi hiện đang làm việc trên một trình tải xuống đa luồng với sự trợ giúp của mô-đun PycURL. Tôi đang tải xuống các phần của các tập tin và hợp nhất chúng sau đó.

Các phần được tải xuống riêng biệt từ nhiều luồng, chúng được ghi vào các tệp tạm thời ở chế độ nhị phân, nhưng khi tôi hợp nhất chúng thành một tệp duy nhất (chúng được hợp nhất theo đúng thứ tự), tổng kiểm tra không khớp.

Điều này chỉ xảy ra trong linux env. Kịch bản tương tự hoạt động hoàn hảo trong Windows env.

Đây là mã (một phần của tập lệnh) hợp nhất các tệp:

with open(filename,'wb') as outfile:
    print('Merging temp files ...')
    for tmpfile in self.tempfile_arr:
        with open(tmpfile, 'rb') as infile:
            shutil.copyfileobj(infile, outfile)
    print('Done!')

Tôi cũng đã thử write()phương pháp này, nhưng nó cũng dẫn đến một vấn đề tương tự và nó sẽ chiếm rất nhiều bộ nhớ cho các tệp lớn.

Nếu tôi thủ công catcác phần của tệp thành một tệp duy nhất trong linux, thì tổng kiểm tra khớp với tệp, thì vấn đề là do việc hợp nhất các tệp của python.

EDIT:
Dưới đây là các tệp và tổng kiểm tra (sha256) mà tôi đã sử dụng để tái tạo vấn đề:


2
Tôi nghĩ openchế độ của bạn không đúng ( wb). Dựa trên stackoverflow.com/a/4388244/3727050 bạn cần ab(hoặc r+bseek)
đô thị

3
Bạn cần cung cấp một ví dụ có thể lặp lại tối thiểu bao gồm một số tempfiles ví dụ. Tôi nghĩ bạn sẽ có thể tái tạo vấn đề với một số tempfiles chỉ vài byte mỗi cái. Hy vọng kích thước bộ đệm không phải là một phần của vấn đề. Ngoài ra chế độ nhị phân có lẽ không quan trọng, vì vậy bạn có thể sử dụng các tệp văn bản thuần túy.
wjandrea

FWIW Tôi không thể tái tạo vấn đề với hai tệp văn bản rất ngắn trên Linux.
wjandrea

Trên thực tế pycurl yêu cầu chế độ nhị phân để ghi dữ liệu.
Saumyakanta Sahoo

3
OK, tài liệu trợ giúp nhưng mã của bạn vẫn còn chưa đầy đủ: filename, self.tempfile_arr, và shutilđược undefined
wjandrea

Câu trả lời:


0

Một trường hợp có thể tái tạo tối thiểu sẽ thuận tiện, nhưng tôi nghi ngờ các dòng mới phổ biến là vấn đề: theo mặc định, nếu các tệp của bạn là văn bản kiểu cửa sổ (dòng mới \r\n), chúng sẽ được dịch sang các dòng mới theo kiểu Unix ( \n) đọc hiểu. Và sau đó những dòng mới theo kiểu unix này sẽ được ghi lại vào tệp đầu ra thay vì những dòng kiểu Windows mà bạn đang mong đợi. Điều đó sẽ giải thích sự khác biệt giữa trăn và cat(không có bản dịch gì).

Cố gắng chạy tập lệnh của bạn đi qua newline=''(chuỗi trống) đến open.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.