ValueError: write() requires mode 'w', 'x', or 'a' in Python zipfile

ValueError: write() requires mode 'w', 'x', or 'a' in Python zipfile

我正在尝试打开存档中的特定文件,然后向其中写入一些内容。我正在使用 zipfile.open() 函数来访问文件:

import zipfile


my_zip = zipfile.ZipFile('D:\files\acrhive.zip')

with my_zip.open('hello.txt', 'w') as my_file:
     my_file.write(b'Hello')
        
my_zip.close()

但是,它警告我有关名为 'hello.txt' 的重复文件。之后我收到以下错误:

ValueError: write() requires mode 'w', 'x', or 'a'

我做错了什么?

我的完整回溯:

D:\python\lib\zipfile.py:1506: UserWarning: Duplicate name: 'hello.txt'
  return self._open_to_write(zinfo, force_zip64=force_zip64)
Traceback (most recent call last):
  File "D:\files\python.py", line 8, in <module>
    with my_zip.open(file, 'w') as my_file:
  File "D:\python\lib\zipfile.py", line 1506, in open
    return self._open_to_write(zinfo, force_zip64=force_zip64)
  File "D:\python\lib\zipfile.py", line 1598, in _open_to_write
    self._writecheck(zinfo)
  File "D:\python\lib\zipfile.py", line 1699, in _writecheck
    raise ValueError("write() requires mode 'w', 'x', or 'a'")
ValueError: write() requires mode 'w', 'x', or 'a'

此时您正在打开存档文件中的文件进行写入,但存档文件本身仅用于读取(默认模式)。

这里的关键是对于文件系统来说,存档里面的文件并不是真正的真实文件存在。对于文件系统,它们只是存档文件中的字节。 zipfile 库,像许多文件管理器一样,特意将它们作为虚拟文件提供给您 - 一些看起来和工作起来都像普通文件的东西,以便更容易以相同的方式使用它们。

所以请尝试打开 zip 文件本身 以进行写入:

zipfile.ZipFile('D:\files\archive.zip', 'w')

夫妇注意事项:

  1. zip 文件和 zip 文件中的文件都应该打开进行写入。
  2. 在您发布的问题代码中,您似乎在 zip 文件名中有错别字:acrhive.ziparchive.zip。如果我的回答代码开始因“找不到文件”而失败,这可能就是原因。
  3. 您也应该使用上下文管理器打开 zip 文件,就像打开其他文件和 file-like 东西一样。

所以把它们放在一起:

with zipfile.ZipFile('D:\files\archive.zip', 'w') as my_zip:
    with my_zip.open('hello.txt', 'w') as my_file:
        my_file.write(b'Hello')