Python新手求助:逐行合并文本文件代码报错排查
帮你排查逐行合并文本文件的代码问题
嘿,作为Python新手遇到这种问题太正常啦,我来帮你拆解下代码里的问题,再给你修正后的可用版本~
原代码的几个核心问题
- zip()的“截断”隐患:你用
zip(f1, f2)来逐行配对两个文件内容,但zip会在较短的文件读完后直接停止迭代。比如如果file1有10行、file2有15行,那file2后面的5行内容会被直接忽略,这大概率不是你想要的效果。 - 单文件分支的代码错误:你写的
for x in zip(F1)完全没必要套zip,这样遍历出来的x是类似('第一行内容',)的元组,打印时会带多余的括号和逗号;而且pr...明显是手滑打错了,应该是print。 - 缺少异常处理:如果输入的文件不存在、或者没有读取权限,代码会直接抛出异常崩溃,没有友好的错误提示。
修正后的完整代码
import sys from itertools import zip_longest # 用来处理长短不一的文件 def merge_files(): if len(sys.argv) == 3: try: with open(sys.argv[1], 'r') as f1, open(sys.argv[2], 'r') as f2: # zip_longest会用fillvalue补全较短文件的缺失行,这里用空字符串占位 for x, y in zip_longest(f1, f2, fillvalue=''): print("{0}\t{1}".format(x.strip(), y.strip())) except FileNotFoundError: print("错误:指定的文件不存在,请检查文件路径!") except PermissionError: print("错误:没有读取该文件的权限!") except Exception as e: print(f"发生未知错误:{e}") elif len(sys.argv) == 2: try: with open(sys.argv[1], 'r') as f1: # 直接遍历文件对象即可,不用套zip for line in f1: print(line.strip()) except FileNotFoundError: print("错误:指定的文件不存在,请检查文件路径!") except PermissionError: print("错误:没有读取该文件的权限!") except Exception as e: print(f"发生未知错误:{e}") else: print("正确用法:") print("1. 合并两个文件:python your_script.py file1.txt file2.txt") print("2. 读取单个文件:python your_script.py file.txt") if __name__ == "__main__": merge_files()
关键改进说明
- 用
itertools.zip_longest替代zip,确保两个文件不管长短,所有行都能被处理,缺失的行用空字符串补全。 - 修复了单文件分支的遍历逻辑,直接读取每行并打印,避免多余的元组符号。
- 添加了常见异常捕获,比如文件不存在、权限问题,给你清晰的错误提示。
- 增加了用法提示,当输入参数不对时能快速知道怎么操作。
内容的提问来源于stack exchange,提问作者Zhu Hongyu
相关产品推荐
相关产品推荐

