如何将.TXT文件转为ZipInfo格式并加入archive.infolist()列表?
解决方案:将本地TXT文件转为ZipInfo后加入列表
完全可行,你的猜想是对的——必须把本地TXT文件转换成ZipInfo对象,才能和archive.infolist()返回的列表元素保持类型一致,进而添加到列表中。
具体实现步骤
创建本地TXT对应的ZipInfo对象
利用zipfile.ZipInfo构造函数生成对象,同时填充必要的文件属性(比如文件名、修改时间、大小等),示例函数如下:import zipfile import os from datetime import datetime def txt_to_zipinfo(txt_path): # 基于文件名创建ZipInfo实例 zip_info = zipfile.ZipInfo(os.path.basename(txt_path)) # 同步本地文件的修改时间 mtime = os.path.getmtime(txt_path) zip_info.date_time = datetime.fromtimestamp(mtime).timetuple()[:6] # 设置原始文件大小 zip_info.file_size = os.path.getsize(txt_path) # 可选:指定压缩类型(后续若需压缩可用) zip_info.compress_type = zipfile.ZIP_DEFLATED # 设置文件属性(匹配示例中的external_attr=0x20) zip_info.external_attr = 0o644 << 16 return zip_info整合到现有代码逻辑中
遍历input_files时区分文件类型:ZIP文件读取内部的ZipInfo列表,本地TXT转成ZipInfo后追加进去,示例代码如下:import zipfile import os from datetime import datetime input_files = ["file1.txt", "file2.txt", "target.zip"] archive_class = zipfile.ZipFile # 初始化统一的ZipInfo列表 all_zipinfos = [] for file_path in input_files: if file_path.endswith('.zip'): # 读取ZIP内的ZipInfo并加入列表 with archive_class(file_path, 'r') as archive: all_zipinfos.extend(archive.infolist()) elif file_path.endswith('.txt'): # 转换本地TXT为ZipInfo后加入列表 zip_info = zipfile.ZipInfo(os.path.basename(file_path)) zip_info.date_time = datetime.fromtimestamp(os.path.getmtime(file_path)).timetuple()[:6] zip_info.file_size = os.path.getsize(file_path) zip_info.compress_type = zipfile.ZIP_DEFLATED zip_info.external_attr = 0o644 << 16 all_zipinfos.append(zip_info) # 此时all_zipinfos包含了所有目标文件的ZipInfo对象 print(all_zipinfos)
注意事项
- 如果不需要对本地TXT进行后续压缩操作,可以省略
compress_type的设置,compress_size也可留空或与file_size保持一致。 external_attr的取值可根据实际文件权限调整,0o644<<16是普通文件的通用设置,与你示例中的external_attr=0x20属性匹配。
内容的提问来源于stack exchange,提问作者ifrj
相关产品推荐
相关产品推荐

