コンピューターが私をからかっている、私はそれを知っています!
Pythonでzipフォルダーを作成しています。個々のファイルはメモリ内で生成され、全体が圧縮されてファイルに保存されます。zip には 9 個のファイルを追加できます。zip には 11 個のファイルを追加できます。しかし、10、いや、10 ファイルではありません。zip ファイルはコンピューターに保存されていますが、開くことができません。Windows は、圧縮された zip フォルダーが無効であると言います。
別のスタックオーバーフローの質問から取得した以下のコードを使用します。10 個のファイルを追加し、zip フォルダーを保存します。フォルダをクリックしても解凍できません。しかし、appends() の 1 つを削除すれば問題ありません。または、別の追加を追加すると機能します!
ここで何が欠けていますか?毎回これを機能させるにはどうすればよいですか?
imz = InMemoryZip()
imz.append("1a.txt", "a").append("2a.txt", "a").append("3a.txt", "a").append("4a.txt", "a").append("5a.txt", "a").append("6a.txt", "a").append("7a.txt", "a").append("8a.txt", "a").append("9a.txt", "a").append("10a.txt", "a")
imz.writetofile("C:/path/test.zip")
import zipfile
import StringIO
class InMemoryZip(object):
def __init__(self):
# Create the in-memory file-like object
self.in_memory_zip = StringIO.StringIO()
def append(self, filename_in_zip, file_contents):
'''Appends a file with name filename_in_zip and contents of
file_contents to the in-memory zip.'''
# Get a handle to the in-memory zip in append mode
zf = zipfile.ZipFile(self.in_memory_zip, "a", zipfile.ZIP_DEFLATED, False)
# Write the file to the in-memory zip
zf.writestr(filename_in_zip, file_contents)
# Mark the files as having been created on Windows so that
# Unix permissions are not inferred as 0000
for zfile in zf.filelist:
zfile.create_system = 0
return self
def read(self):
'''Returns a string with the contents of the in-memory zip.'''
self.in_memory_zip.seek(0)
return self.in_memory_zip.read()
def writetofile(self, filename):
'''Writes the in-memory zip to a file.'''
f = file(filename, "w")
f.write(self.read())
f.close()