Python'da birden fazla ikili dosyayı düzgün şekilde nasıl işleyebilirim?


10

Şu anda PycURL modülü yardımıyla çok iş parçacıklı bir downloader üzerinde çalışıyorum. Dosyaların bir kısmını indiriyorum ve daha sonra birleştiriyorum.

Parçalar birden çok iş parçacığından ayrı olarak indirilir, ikili modda geçici dosyalara yazılır, ancak bunları tek bir dosyada birleştirdiğimde (doğru sırada birleştirilirler), sağlama toplamları eşleşmez.

Bu sadece linux env'de olur. Aynı komut dosyası Windows env'de kusursuz çalışır.

Dosyaları birleştiren kod (betiğin bir parçası):

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()Yöntemi de denedim , ancak aynı sorunla sonuçlanıyor ve büyük dosyalar için çok fazla bellek alacak.

catParça dosyalarını Linux'ta tek bir dosyaya manuel olarak koyarsam, dosyanın sağlama toplamı eşleşirse , sorun python'un dosyaları birleştirmesiyle ilgilidir.

EDIT:
İşte sorunu yeniden oluşturmak için kullanılan dosyaları ve sağlama toplamları (sha256):


2
Bence openmodun doğru değil ( wb). Dayanarak stackoverflow.com/a/4388244/3727050 sen gerek ab(veya r+bve seek)
Kentsel

3
Bazı örnek dosyalar da dahil olmak üzere minimal tekrarlanabilir bir örnek sağlamanız gerekir . Sorunu, her biri sadece birkaç baytlık bazı geçici dosyalarla yeniden oluşturabilmeniz gerektiğini düşünüyorum. Umarım arabellek boyutu sorunun bir parçası değildir. Ayrıca ikili mod muhtemelen önemli değildir, bu nedenle düz metin dosyaları kullanabilirsiniz.
wjandrea

FWIW Maalesef Linux'ta çok kısa iki metin dosyasıyla sorunu yeniden üretemedim.
wjandrea

Aslında pycurl veri yazmak için ikili mod gerektirir.
Saumyakanta Sahoo

3
Tamam, dosyalar yardım ancak kod eksik hala: filename, self.tempfile_arr, ve shutiltanımsız olduğunu
wjandrea

Yanıtlar:


0

En az düzeyde tekrarlanabilir bir durum uygun olurdu, ancak evrensel yeni satırların sorun olduğundan şüphelenirim : varsayılan olarak, dosyalarınız Windows \r\ntarzı metinse (yeni satırlar \n), Unix tarzı yeni satırlara ( ) çevrileceklerdir . okuma. Ve sonra bu unix tarzı yeni satırlar, beklediğiniz Windows tarzı olanlardan ziyade çıktı dosyasına geri yazılacak. Bu, python ile cat(hiçbir çeviri yapmaz) arasındaki ayrımı açıklardı .

Komut dosyanızı geçerken newline=''(boş dize) çalıştırmayı deneyin open.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.