2016-05-25 9 views
0

Ich habe mehrere csv-Dateien, von denen einige komprimiert sind, andere nicht, alle in einem 7z-Archiv. Ich möchte die CSV-Dateien lesen und den Inhalt in einer Datenbank speichern. Wenn jedoch py7zlib versucht, die Daten aus einer CSV-Datei zu lesen, die tatsächlich nicht komprimiert ist, erhalte ich den Fehler data error during decompression.Python-Extrakt unkomprimierte Daten aus 7z-Datei

import os 
import py7zlib 

scr = r'Y:\PathtoArchive' 
z7file = 'ArchiveName.7z' 

with open(os.path.join(scr,z7file),'rb') as f: 
    archive = py7zlib.Archive7z(f) 

    names = archive.filenames 

    for mem in names: 

     obj = archive.getmember(mem) 
     print obj.compressed # prints None for uncompressed data 
     try: 
      data = obj.read() 
     except Exception as er: 
      print er   # prints data error during decompression 
           # whenever obj.compressed is None 

Der Fehler tritt in

File "C:\Anaconda\lib\site-packages\py7zlib.py", line 608, in read 
data = getattr(self, decoder)(coder, data, level) 
File "C:\Anaconda\lib\site-packages\py7zlib.py", line 671, in _read_lzma 
return self._read_from_decompressor(coder, dec, input, level, checkremaining=True, with_cache=True) 
File "C:\Anaconda\lib\site-packages\py7zlib.py", line 646, in _read_from_decompressor 
tmp = decompressor.decompress(data) 
ValueError: data error during decompression 

Also, wie kann ich nicht komprimierte Daten von einem 7z-Archive zu extrahieren?

+1

Hat die komprimierte Datei ein Passwort? –

+0

nein. Keine der Dateien hat ein Passwort. – user3820991

Antwort

1

Obwohl ich nicht wirklich herausfinden konnte, was das Problem zu sein schien, fand ich einen Workaround, der das ultimative Ziel löste, die Daten aus CSV-Dateien aus einem 7z-Archiv zu erhalten. 7-zip kommt mit einem Befehlszeilenprogramm. Die Kommunikation mit dem Werkzeug über das Subprozess Modul, konnte ich extrahieren automatisch die Dateien, die ich ohne Probleme zu extrahieren wihsed

import subprocess 
import py7zlib 

archiveman = r'c:\Program Files\7-zip\7z' # 7z.exe comes with 7-zip 
archivepath = r'C:\Path\to\archive.7z' 

with open(archivepath,'rb') as f: 
    archive = py7zlib.Archive7z(f) 
    names = archive.filenames 
    for name in names: 
     _ = subprocess.check_output([archiveman, 'e', archivepath, '-o{}'.format(r'C:\Destination\of\copy'), name]) 

Die verschiedenen Befehle, die mit 7z verwendet werden können, können here gefunden werden.