python - 如何压缩以特定扩展名结尾的文件

标签 python python-zipfile

我想获取以 .npy 或 csv 结尾的目录中的所有文件(我在执行了几次 for 循环后到达了它 - 因此是 Fourth.path),然后压缩这些文件。 我的代码正在运行,仅将一个文件放入 zip 文件中。我究竟做错了什么? 我尝试更改缩进,但没有创建 zip 文件

import json
import os
import zipfile
import zlib

directory = os.path.join(os.getcwd(), 'recs')
radarfolder = 'RadarIfxAvian'
file = os.listdir(directory)

def r(p, name):
    p = os.path.join(p, name)
    return p.replace("/", "\\") 

#This code will list all json files in e    ach file
for first in os.scandir(directory):
    if first.is_dir():
        for second in os.scandir(first.path):
            if second.is_dir():
               for third in os.scandir(second.path):
                if third.is_dir():
                    radar_folder_name = ''
                    list_files = ()
                    for fourth in os.scandir(third.path):
                        if fourth.is_dir():
                            if radarfolder in fourth.path:
                                radar_folder_name = fourth.path
                                print(radar_folder_name)
                                list_files = ()
                                for file in os.listdir(fourth.path):
                                    if file.endswith(".npy") | file.endswith(".csv"):
                                        list_files = (file)
                                        print(list_files)
                                    with zipfile.ZipFile(radar_folder_name +'\\' +'radar.zip', 'w', compression=zipfile.ZIP_DEFLATED ) as zipMe:
                                        zipMe.write(radar_folder_name +'\\' +list_files)            
                                        zipMe.close()

我尝试更改缩进,要么导致错误:TypeError: can only concatenate str (not "tuple") to str or no zip file being create

最佳答案

正如我在第二条评论中所说,您的问题来自压缩语句中的“w”参数。它会导致 zip 每次打开时都会被覆盖,您对压缩的每个文件都会执行此操作。您可以通过两种方式(至少)修复此问题:

  • 将“w”替换为“a”;这样,文件将被附加到您的 zip 中(副作用是,如果多次执行此操作,文件将被添加多次)。
  • 保留“w”,但仅打开 zip 一次,之前列出了您要压缩的所有文件。请参阅下面的代码。

我冒昧地重写了您查找“RadarIfxAvian”文件夹的代码部分,因为嵌入的 for 很笨拙(如果您的文件夹结构发生变化,它们可能无法工作),用多用途递归函数替换它。

请注意,文件夹结构将包含在 .zip 中;如果您只想压缩文件本身,请考虑在压缩文件之前执行 os.chdir(radar_folder_name) 操作。

# This function recursively looks for the 'filename' file or folder
# under 'start_path' and returns the full path, or an empty string if not found.
def find_file(start_path, filename):
    if filename in os.listdir(start_path):
        return start_path + '/' + filename
    for file in os.scandir(start_path):
        if not file.is_dir():
            continue
        if (deep_path:=find_file(start_path + '/' + file.name, filename)):
            return deep_path
    return ''

directory = os.path.join(os.getcwd(), 'recs')
radarfolder = 'RadarIfxAvian'

radar_folder_name = find_file(directory, radarfolder)
print(radar_folder_name)
list_files = []
for file in os.listdir(radar_folder_name):
    if file.endswith(".npy") or file.endswith(".csv"):
        list_files.append(file)
with zipfile.ZipFile(radar_folder_name + '/' + 'radar.zip', 'w', compression=zipfile.ZIP_DEFLATED ) as zipMe:
    for file in list_files:
        zipMe.write(radar_folder_name + '/' + file)

    

关于python - 如何压缩以特定扩展名结尾的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75288575/

相关文章:

python - 为 ORTOOLS CP-SAT 中的变量设置可能的唯一值数量

Python zipfile 模块不压缩文件

python - 从 zip 中提取文件而不用 python zipfile 保留顶级文件夹

python - 在 Python 中循环 zipfile 时,我怎么知道一个项目是一个目录?

python - ZipFile.extractall 抛出 ZipFile 实例没有属性 'extractall'

python - Matplotlib:在指定的 x 轴范围内绘制两个图形

python - 如何正确地将一个元素的列表转换为一个元素的元组

python - 如何在Python中分组并粘贴字符串

python - 在 zip 文件中递归列出所有目录,无需在 python 中解压

python - 在 Python 中为线性拟合(具有两个参数)生成置信区间等高线图