該PKZIP文件是高度結構化的,只是追加到最後會把它搞砸了。我不能說早期版本的工作,但解決這個問題的方法是打開一個zip文件進行閱讀,打開一個新的文件,提取第一個文件的內容,然後在最後添加你的添加組件。完成後,用新創建的文件替換原始的zip文件。
運行代碼時運行代碼時我得到的回溯是:
Traceback (most recent call last):
File "zip.py", line 19, in <module>
Foo()
File "zip.py", line 17, in Foo
print zip.read("bar")
File "/usr/lib/python2.6/zipfile.py", line 834, in read
return self.open(name, "r", pwd).read()
File "/usr/lib/python2.6/zipfile.py", line 874, in open
zinfo.orig_filename, fname)
zipfile.BadZipfile: File name in directory "bar" and header "foo" differ.
經仔細檢查,我注意到,你從一個類文件StringIO的閱讀與「a'ppend模式打開它應該導致讀取錯誤,因爲'a'通常不可讀,並且當然必須在讀取和寫入之間尋找()。我會欺騙一些並更新它。
更新:
偷了幾乎所有從道格·赫爾曼的優秀Python Module of the Week這個代碼,我發現它的作品如我所料相當多。人們不能僅僅附加到一個結構化的PKZIP文件,如果在原來的職位代碼做過的工作,這是意外:
import zipfile
import datetime
def create(archive_name):
print 'creating archive'
zf = zipfile.ZipFile(archive_name, mode='w')
try:
zf.write('/etc/services', arcname='services')
finally:
zf.close()
def print_info(archive_name):
zf = zipfile.ZipFile(archive_name)
for info in zf.infolist():
print info.filename
print '\tComment:\t', info.comment
print '\tModified:\t', datetime.datetime(*info.date_time)
print '\tSystem:\t\t', info.create_system, '(0 = Windows, 3 = Unix)'
print '\tZIP version:\t', info.create_version
print '\tCompressed:\t', info.compress_size, 'bytes'
print '\tUncompressed:\t', info.file_size, 'bytes'
print
zf.close()
def append(archive_name):
print 'appending archive'
zf = zipfile.ZipFile(archive_name, mode='a')
try:
zf.write('/etc/hosts', arcname='hosts')
finally:
zf.close()
def expand_hosts(archive_name):
print 'expanding hosts'
zf = zipfile.ZipFile(archive_name, mode='r')
try:
host_contents = zf.read('hosts')
finally:
zf.close
zf = zipfile.ZipFile(archive_name, mode='a')
try:
zf.writestr('hosts', host_contents + '\n# hi mom!')
finally:
zf.close()
def main():
archive = 'zipfile.zip'
create(archive)
print_info(archive)
append(archive)
print_info(archive)
expand_hosts(archive)
print_info(archive)
if __name__ == '__main__': main()
值得注意的是,從上一次調用輸出到print_info
:
...
hosts
Modified: 2010-05-20 03:40:24
Compressed: 404 bytes
Uncompressed: 404 bytes
hosts
Modified: 2010-05-27 11:46:28
Compressed: 414 bytes
Uncompressed: 414 bytes
它沒有附加到現有的arcname'hosts',它創建了一個額外的存檔成員。
「濟n'ai既成事實勒慈加椅闕 parce闕乙腦n'ai PAS歐盟樂德羅伊薩拉 放任加courte。」
- 帕斯卡