zipfile:直接添加文件到zip压缩包中,而不包含文件夹

这段代码演示了如何使用Python的zipfile模块创建一个ZIP压缩文件,将`Evidence/20220616`目录下的所有文件添加到压缩包中,并采用DEFLATED压缩方法。
import os
import zipfile

zf = zipfile.ZipFile("test.zip", "w")
for root, subdirs, files in os.walk("Evidence/20220616"):
    for filename in files:
        zf.write(os.path.join(root, filename), filename, zipfile.ZIP_DEFLATED)
zf.close()

ZIP 压缩包添加文件覆盖已有内容,并保持原有路径结构,可以通过多种方式实现。以下方法涵盖了命令行工具、Python 和 Java 的实现方案。 --- ### 使用 `zip` 命令行工具(Linux/macOS) 可以使用 `zip` 命令的 `-r` 参数将新文件添加到现有 ZIP 归档中,同时保留原始路径结构: ```bash zip -r existing.zip new_file.txt ``` 该命令会将 `new_file.txt` 添加到 `existing.zip` 中,而会影响压缩包中的其他条目。如果压缩包中已存在同名文件,则会直接覆盖原文件[^4]。 若希望添加整个目录并保留其子目录结构,可使用如下命令: ```bash zip -r existing.zip folder_to_add/ ``` 此操作将递归地将指定目录及其内容添加ZIP 文件,并保持原有的目录层级结构变[^4]。 --- ### 使用 Python 实现 ZIP 文件追加 Python 提供了 `zipfile` 模块,支持以追加模式 (`a`) 打开 ZIP 文件添加新内容。这种方式会影响 ZIP 包中已有的条目,并且能有效保留文件路径信息。 示例代码如下: ```python import zipfile def add_file_to_zip(zip_path, file_path): with zipfile.ZipFile(zip_path, mode='a') as zipf: zipf.write(file_path, arcname=file_path) # 示例调用 add_file_to_zip('existing.zip', 'new_file.txt') ``` 上述代码通过 `arcname` 参数指定文件ZIP 包中的存储路径,从而保证路径结构被改变。该方法适用于向 ZIP 包中添加单个文件或多个文件的情况[^2]。 对于批量添加文件,可以结合遍历操作: ```python import os def add_files_to_zip(zip_path, folder_path): with zipfile.ZipFile(zip_path, mode='a') as zipf: for root, dirs, files in os.walk(folder_path): for file in files: file_path = os.path.join(root, file) arcname = os.path.relpath(file_path, os.path.dirname(folder_path)) zipf.write(file_path, arcname=arcname) ``` 此函数会递归地将指定文件夹下的所有文件添加ZIP 包,并保留完整的目录结构。 --- ### 使用 Java 实现 ZIP 文件追加 Java 中没有内置支持直接修改 ZIP 文件的功能,因此需要手动读取原始 ZIP 文件并将内容复制到新的 ZIP 输出流中,再追加新文件。以下是实现代码: ```java import java.io.*; import java.nio.file.*; import java.util.zip.*; import java.util.Enumeration; public class ZipAppender { public static void addFilesToZip(String zipFilePath, String[] filesToAdd, String outputZipPath) throws IOException { Path tempZip = Files.createTempFile("temp", ".zip"); try ( ZipFile existingZip = new ZipFile(zipFilePath); ZipOutputStream newZip = new ZipOutputStream(Files.newOutputStream(tempZip)) ) { // 复制现有条目到新ZIP Enumeration<? extends ZipEntry> entries = existingZip.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); try (InputStream is = existingZip.getInputStream(entry)) { newZip.putNextEntry(new ZipEntry(entry.getName())); byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = is.read(buffer)) > 0) { newZip.write(buffer, 0, bytesRead); } newZip.closeEntry(); } } // 添加文件ZIP for (String filePath : filesToAdd) { File fileToAdd = new File(filePath); ZipEntry newEntry = new ZipEntry(fileToAdd.getName()); newZip.putNextEntry(newEntry); try (InputStream is = new FileInputStream(fileToAdd)) { byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = is.read(buffer)) > 0) { newZip.write(buffer, 0, bytesRead); } } newZip.closeEntry(); } } // 替换原始ZIP文件 Files.move(tempZip, Paths.get(outputZipPath), StandardCopyOption.REPLACE_EXISTING); } public static void main(String[] args) { try { String originalZip = "existing.zip"; String[] filesToAdd = {"file1.txt", "file2.txt"}; String outputZip = "updated.zip"; addFilesToZip(originalZip, filesToAdd, outputZip); System.out.println("文件已成功添加ZIP压缩包中。"); } catch (IOException e) { e.printStackTrace(); } } } ``` 此方法通过创建临时 ZIP 文件来保留原始内容,并逐个复制条目以避免覆盖。最终用临时文件替换原始 ZIP 文件完成更新[^5]。 --- ### 注意事项 - **备份原始文件**:在进行任何 ZIP 文件修改操作前,建议先对原始文件进行备份,防止数据丢失。 - **编码问题**:如果 ZIP 文件包含中文文件名,在某些环境中可能出现乱码。这是因为 ZIP 标准未强制记录文件名编码。可以通过设置解码方式或使用兼容性更好的工具解决此类问题[^1]。 - **性能优化**:对于大体积 ZIP 文件,应考虑使用缓冲区提高 I/O 效率,并尽量减少内存占用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值