Python文件合并与排序技术问询:循环简化及排序问题修复
问题A:用循环简化重复合并代码
你可以把目标文件与对应待合并的源文件列表做成键值对映射,通过一次循环完成所有合并操作,彻底消除重复代码:
# 定义目标文件与对应源文件列表的映射 target_mappings = { "Universe.tls": [file1, file2, file3], # 替换成你实际的源文件列表 "HighVolumeOnly.tls": [file4, file5] # 替换成你实际的源文件列表 } # 循环处理每个目标文件的合并 for target_file, source_files in target_mappings.items(): with open(target_file, 'w') as outfile: for source in source_files: with open(source, 'r') as infile: outfile.write(infile.read()) # 如果需要在文件间添加分隔符,可在此处添加,比如: # outfile.write('\n')
后续不管要增加多少目标文件或源文件,只需要修改target_mappings即可,无需重复编写合并逻辑。
问题B:修复MergeFiles列表的排序问题
原排序代码失效大概率是因为默认字符串排序不符合预期(比如文件名含数字时,"file10"会排在"file2"前面),可根据文件名特征选择以下方案:
方案1:自然排序(适用于含数字的文件名)
如果文件名包含数字且需要按数字大小排序,可自定义排序key函数:
# 提取文件名中的数字作为排序依据 MergeFiles.sort(key=lambda filename: int(''.join(filter(str.isdigit, filename))))
若文件名格式更复杂(前缀+数字+后缀),可拆分后排序:
def natural_sort_key(filename): # 拆分文件名的文字与数字部分,如"file123.tls"拆分为("file", 123, ".tls") parts = [] current_part = [] is_digit = False for c in filename: if c.isdigit() != is_digit: if current_part: parts.append(''.join(current_part)) current_part = [c] is_digit = c.isdigit() else: current_part.append(c) if current_part: parts.append(''.join(current_part)) # 将数字部分转为整数,文字部分保留字符串 return [int(p) if p.isdigit() else p for p in parts] MergeFiles.sort(key=natural_sort_key)
方案2:字典序排序(适用于纯文字文件名)
如果只需要普通字典序排序,直接调用列表排序方法即可:
MergeFiles.sort() # 如需反向排序,添加参数: # MergeFiles.sort(reverse=True)
内容的提问来源于stack exchange,提问作者erukumk
相关产品推荐
相关产品推荐

