如何用Python批量提取250个日期命名文件夹中的H1.gz文件
用Python批量处理H1.gz文件的解决方案
下面分两种常见需求给出实现代码,你可以根据实际情况选择:
需求1:直接复制所有H1.gz文件到汇总文件夹
如果只是要把所有H1.gz文件集中到一个文件夹,用以下代码:
import os import shutil import re # 替换为实际路径 source_parent_dir = r"C:\存放所有日期文件夹的根目录" target_dir = r"C:\你要汇总到的目标文件夹" # 创建目标文件夹(不存在则自动创建) os.makedirs(target_dir, exist_ok=True) # 匹配YYYYMMDD格式的文件夹名 date_folder_pattern = re.compile(r'^\d{8}$') # 遍历根目录下的所有子项 for folder_name in os.listdir(source_parent_dir): folder_full_path = os.path.join(source_parent_dir, folder_name) # 只处理符合日期格式的文件夹 if os.path.isdir(folder_full_path) and date_folder_pattern.match(folder_name): h1_gz_path = os.path.join(folder_full_path, "H1.gz") if os.path.exists(h1_gz_path): # 给文件名加上日期前缀,避免重名覆盖 target_file_path = os.path.join(target_dir, f"{folder_name}_H1.gz") shutil.copy2(h1_gz_path, target_file_path) print(f"完成复制: {h1_gz_path}") else: print(f"警告: {folder_full_path} 中未找到H1.gz")
需求2:解压所有H1.gz文件到汇总文件夹
如果需要把每个H1.gz里的内容解压出来汇总,分两种情况处理:
情况A:H1.gz是单个文件的压缩包
import os import gzip import shutil import re source_parent_dir = r"C:\存放所有日期文件夹的根目录" target_dir = r"C:\你要汇总到的目标文件夹" os.makedirs(target_dir, exist_ok=True) date_folder_pattern = re.compile(r'^\d{8}$') for folder_name in os.listdir(source_parent_dir): folder_full_path = os.path.join(source_parent_dir, folder_name) if os.path.isdir(folder_full_path) and date_folder_pattern.match(folder_name): h1_gz_path = os.path.join(folder_full_path, "H1.gz") if os.path.exists(h1_gz_path): # 用日期前缀命名解压后的文件,避免重名 extracted_file_path = os.path.join(target_dir, f"{folder_name}_H1") with gzip.open(h1_gz_path, 'rb') as f_in: with open(extracted_file_path, 'wb') as f_out: shutil.copyfileobj(f_in, f_out) print(f"完成解压: {h1_gz_path}") else: print(f"警告: {folder_full_path} 中未找到H1.gz")
情况B:H1.gz是tar.gz格式的多文件压缩包
如果你的H1.gz实际是tar.gz(包含多个文件),用以下代码:
import os import tarfile import shutil import re source_parent_dir = r"C:\存放所有日期文件夹的根目录" target_dir = r"C:\你要汇总到的目标文件夹" os.makedirs(target_dir, exist_ok=True) date_folder_pattern = re.compile(r'^\d{8}$') for folder_name in os.listdir(source_parent_dir): folder_full_path = os.path.join(source_parent_dir, folder_name) if os.path.isdir(folder_full_path) and date_folder_pattern.match(folder_name): h1_gz_path = os.path.join(folder_full_path, "H1.gz") if os.path.exists(h1_gz_path): with tarfile.open(h1_gz_path, 'r:gz') as tar: # 提取所有文件到临时目录,再重命名避免冲突 temp_extract_dir = os.path.join(target_dir, f"temp_{folder_name}") tar.extractall(temp_extract_dir) # 将提取的文件移动到目标目录并加上日期前缀 for root, _, files in os.walk(temp_extract_dir): for file in files: old_file_path = os.path.join(root, file) new_file_path = os.path.join(target_dir, f"{folder_name}_{file}") shutil.move(old_file_path, new_file_path) # 删除临时目录 shutil.rmtree(temp_extract_dir) print(f"完成解压: {h1_gz_path}") else: print(f"警告: {folder_full_path} 中未找到H1.gz")
注意事项
- 路径前加
r是为了避免Windows路径中的反斜杠被当作转义字符 exist_ok=True需要Python 3.2及以上版本,如果你用的是旧版本,可以替换成以下代码创建文件夹:if not os.path.exists(target_dir): os.makedirs(target_dir)- 给文件加日期前缀是为了避免不同日期的文件重名覆盖,如果你不需要可以去掉相关命名逻辑
内容的提问来源于stack exchange,提问作者batataman
相关产品推荐
相关产品推荐

