2

我正在尝试打开存档中的特定文件,然后向其中写入一些内容。我正在使用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'
4

1 回答 1

3

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

这里的关键是,对于文件系统来说,存档中的文件并不真正作为真实文件存在。对于文件系统,它们只是存档文件中的字节。与许多文件管理器一样,该zipfile库会竭尽全力将它们作为虚拟文件提供给您 - 看起来和工作起来都像普通文件一样,以便以相同的方式更轻松地使用它们。

因此,请尝试打开zip 文件本身进行写入:

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

情侣笔记:

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

所以把它们放在一起:

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')
于 2022-02-09T16:56:31.847 回答