我想获取以 .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/