Bu satırları yineleme sağlayacaktır. Başka bir soruya answer'da bulduğum bazı kodlardan kısmen türetilmiş.
Bildiğim kadarıyla, zaman içinde bu noktada py7zlib
arşiv üyeleri bayt veya bir akışı olarak okunmasına izin verecek bir API sağlamaz söyleyebilirim karakterlerin-onun ArchiveFile
sınıf yalnızca basıncı azaltan read()
fonksiyonu sağlar ve sıkıştırılmamış tüm verileri bir kerede üye olan bir kerede verir. Bunu yaptığınızda, yapabileceğiniz en iyi şey, bir arabellek olarak yinelemeli olarak bayt veya satır döndürmektir. Aşağıdaki, ancak sorun arşiv üyesi dosyanın kendisi çok ise çok yardımcı değil.
Python 2.7 ve 3.x'te çalışmak için aşağıdaki kodu değiştirdim.
import io
import os
import py7zlib
class SevenZFileError(py7zlib.ArchiveError):
pass
class SevenZFile(object):
@classmethod
def is_7zfile(cls, filepath):
""" Determine if filepath points to a valid 7z archive. """
is7z = False
fp = None
try:
fp = open(filepath, 'rb')
archive = py7zlib.Archive7z(fp)
_ = len(archive.getnames())
is7z = True
finally:
if fp: fp.close()
return is7z
def __init__(self, filepath):
fp = open(filepath, 'rb')
self.filepath = filepath
self.archive = py7zlib.Archive7z(fp)
def __contains__(self, name):
return name in self.archive.getnames()
def readlines(self, name):
""" Iterator of lines from an archive member. """
if name not in self:
raise SevenZFileError('archive member %r not found in %r' %
(name, self.filepath))
for line in io.StringIO(self.archive.getmember(name).read().decode()):
yield line
Örnek kullanım: Biz hata üretebilir ve nasıl yardımcı olabiliriz görebilirsiniz
import csv
if SevenZFile.is_7zfile('testing.csv.7z'):
sevenZfile = SevenZFile('testing.csv.7z')
if 'testing.csv' not in sevenZfile:
print('testing.csv is not a member of testing.csv.7z')
else:
reader = csv.reader(sevenZfile.readlines('testing.csv'))
for row in reader:
print(', '.join(row))
Neden kodu ve bir örnek dosyayı yayınlamayın? –
.7z dosyası, birden fazla dosya içerebilen kapsayıcılardır (arşivler), yani okumak istediğiniz 'test.7z 'içindeki dosya adı nedir? – martineau
@martineau, testing.csv – Yariv