Как правильно обрабатывать несколько двоичных файлов в Python?

10

В настоящее время я работаю над многопоточным загрузчиком с помощью модуля PycURL. Я загружаю части файлов и объединяю их впоследствии.

Части загружаются отдельно из нескольких потоков, они записываются во временные файлы в двоичном режиме, но когда я объединяю их в один файл (они объединяются в правильном порядке), контрольные суммы не совпадают.

Это происходит только в Linux Env. Этот же скрипт работает безупречно в Windows env.

Это код (часть скрипта), который объединяет файлы:

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!')

Я также попробовал write()метод, но он приводит к той же самой проблеме, и это займет много памяти для больших файлов.

Если я вручную создаю catфайлы частей в один файл в linux, то контрольная сумма файла совпадает, проблема заключается в слиянии файлов в python.

РЕДАКТИРОВАТЬ:
Вот файлы и контрольные суммы (sha256), которые я использовал, чтобы воспроизвести проблему:

Saumyakanta Sahoo
источник
2
Я думаю, что ваш openрежим не подходит ( wb). На основании stackoverflow.com/a/4388244/3727050 вам нужно ab(или r+bи seek)
городские
3
Вам необходимо предоставить минимальный воспроизводимый пример, включающий несколько примеров временных файлов. Я думаю, что вы должны быть в состоянии воспроизвести проблему с некоторыми временными файлами по несколько байт каждый. Надеюсь, размер буфера не является частью проблемы. Также двоичный режим, вероятно, не важен, поэтому вы можете использовать простые текстовые файлы.
wjandrea
К сожалению, мне не удалось воспроизвести проблему с двумя очень короткими текстовыми файлами в Linux.
wjandrea
На самом деле pycurl требует двоичного режима для записи данных.
Saumyakanta Sahoo
3
OK, файлы справка , но ваш код по - прежнему неполная: filename, self.tempfile_arrи shutilне определена
wjandrea

Ответы:

0

Минимально воспроизводимый случай был бы удобен, но я бы предположил, что проблема заключается в универсальных символах новой строки : по умолчанию, если ваши файлы представляют собой текст в стиле Windows (символы новой строки \r\n), они будут переведены в символ новой строки Unix ( \n) в чтение. И тогда эти новые строки в стиле Unix будут записаны обратно в выходной файл, а не в стиле Windows, который вы ожидали. Это объяснило бы расхождение между python и cat(что не переводило бы вообще).

Попробуйте запустить свой скрипт, передав newline=''(пустую строку) в open.

Masklinn
источник