Como lidar adequadamente com vários arquivos binários em python?


10

Atualmente, estou trabalhando em um downloader multiencadeado com a ajuda do módulo PycURL. Estou baixando partes dos arquivos e depois as mesclando.

As partes são baixadas separadamente de vários segmentos, elas são gravadas em arquivos temporários no modo binário, mas quando as mesclo em um único arquivo (elas são mescladas na ordem correta), as somas de verificação não coincidem.

Isso só acontece no Linux linux. O mesmo script funciona perfeitamente no ambiente Windows.

Este é o código (parte do script) que mescla os arquivos:

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

Eu tentei o write()método também, mas resulta com o mesmo problema e levará muita memória para arquivos grandes.

Se eu manualmente catos arquivos de peça em um único arquivo no linux, a soma de verificação do arquivo corresponde, o problema está na mesclagem de arquivos do python.

Edição:
Aqui estão os arquivos e somas de verificação (sha256) que eu usei para reproduzir o problema:


2
Eu acho que seu openmodo não está certo ( wb). Baseado em stackoverflow.com/a/4388244/3727050 você precisa ab(ou r+be seek)
urban

3
Você precisa fornecer um exemplo reproduzível mínimo, incluindo alguns exemplos de arquivos temporários. Eu acho que você deve conseguir reproduzir o problema com alguns arquivos temporários de apenas alguns bytes cada. Esperemos que o tamanho do buffer não faça parte do problema. Além disso, o modo binário provavelmente não é importante, portanto você pode usar arquivos de texto sem formatação.
Wjandrea

Infelizmente, não foi possível reproduzir o problema com dois arquivos de texto muito curtos no Linux.
wjandrea

Na verdade, o pycurl requer o modo binário para gravar dados.
Saumyakanta Sahoo

3
OK, os arquivos de ajuda, mas o código ainda está incompleta: filename, self.tempfile_arr, e shutilsão indefinidos
wjandrea

Respostas:


0

Um caso minimamente reproduzível seria conveniente, mas eu suspeitaria que as novas linhas universais sejam o problema: por padrão, se seus arquivos forem do tipo texto do Windows (novas linhas são \r\n), eles serão traduzidos para as novas linhas do estilo Unix ( \n) em lendo. E então essas novas linhas no estilo unix serão gravadas de volta no arquivo de saída, e não no estilo do Windows que você esperava. Isso explicaria a divergência entre python e cat(que não faria nenhuma tradução).

Tente executar seu script passando newline=''(a string vazia) para open.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.