파이썬에서 여러 바이너리 파일을 올바르게 처리하는 방법은 무엇입니까?


10

현재 PycURL 모듈의 도움을 받아 멀티 스레드 다운로더에서 작업하고 있습니다. 파일의 일부를 다운로드하고 나중에 병합합니다.

부분은 여러 스레드와 별도로 다운로드되고 바이너리 모드로 임시 파일에 기록되지만 단일 파일로 병합하면 올바른 순서로 병합됩니다. 체크섬이 일치하지 않습니다.

이것은 리눅스 환경에서만 발생합니다. 동일한 스크립트가 Windows 환경에서 완벽하게 작동합니다.

파일을 병합하는 코드 (스크립트의 일부)입니다.

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리눅스에서 수동으로 부품 파일을 단일 파일로 만들면 파일의 체크섬이 일치하면 문제는 파이썬의 파일 병합과 관련이 있습니다.

편집 :
다음은 문제를 재현하는 데 사용한 파일과 체크섬 (sha256)입니다.


2
귀하의 open모드가 옳지 않다고 생각합니다 ( wb). 를 기반으로 stackoverflow.com/a/4388244/3727050 당신이 필요로 ab(또는 r+bseek)
도시

3
일부 임시 파일을 포함 하여 최소한의 재현 가능한 예 를 제공해야합니다 . 나는 단지 몇 바이트의 임시 파일로 문제를 재현 할 수 있어야한다고 생각합니다. 바라건대 버퍼 크기는 문제의 일부가 아닙니다. 또한 바이너리 모드는 중요하지 않으므로 일반 텍스트 파일을 사용할 수 있습니다.
wjandrea

FWIW 불행히도 Linux에서 두 개의 매우 짧은 텍스트 파일로 문제를 재현 할 수 없었습니다.
wjandrea

실제로 pycurl은 데이터를 쓰려면 바이너리 모드가 필요합니다.
Saumyakanta Sahoo

3
OK, 파일 도움말하지만 코드가 불완전 여전히 : filename, self.tempfile_arr,와 shutil정의되지 않은 있습니다
wjandrea

답변:


0

최소한의 재현 가능한 경우가 편리하지만 보편적 인바꿈 이 문제가 될 것으로 생각 됩니다. 기본적으로 파일이 창 ​​스타일 텍스트 (줄 바꿈 \r\n) 인 경우 Unix 스타일 줄 바꿈 ( \n)으로 변환됩니다 . 독서. 그리고 그 유닉스 스타일의 줄 바꿈은 예상했던 Windows 스타일의 줄이 아닌 출력 파일에 다시 쓰여질 것입니다. 그것은 파이썬과 파이썬의 차이점을 설명 할 것입니다.cat (어떤 번역도하지 않음) .

newline=''에 빈 문자열을 전달하여 스크립트를 실행하십시오 open.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.