Python逐行复制文件添加右对齐行号时为何输出None
问题原因
你的代码输出None、达不到预期效果是多个逻辑错误叠加导致的:
- 核心错误:
print()函数没有业务返回值,执行后只会把内容打印到控制台,返回值固定是None。你把print()的返回值赋值给变量h,后续操作的h本质就是None,这就是输出结果全是None的根本原因。 - 对齐逻辑错误:你是对存了None的
h转字符串后做右对齐,根本没有对行号本身做4列右对齐处理,完全不符合需求。 - 写入位置错误:
g.write(str(j))写在for循环的外面,循环过程中j会被每一行的计算结果反复覆盖,最终只会保留最后一次循环的j值,前面所有行的内容全部丢失,根本不会写入文件。 - 资源泄漏风险:直接用
open()打开文件后没有手动调用close()关闭,可能出现写入内容没有刷入磁盘、文件句柄被长期占用的问题。 - 换行处理问题:读取到的每行文本本身自带末尾换行符,后续拼接时如果不做处理很容易出现多余空行。
修正后的实现
推荐使用with上下文管理器处理文件读写,会自动完成文件关闭操作,不需要手动维护资源释放。对齐逻辑直接针对行号做4列右对齐,每行拼接完成后立刻写入目标文件即可:
fileA = input("Enter the filename 1: ") fileB = input("Enter the filename 2: ") lineNo = 0 # 同时打开两个文件,自动处理关闭逻辑 with open(fileA, 'r', encoding='utf-8') as f, open(fileB, 'w', encoding='utf-8') as g: for line in f: lineNo += 1 # 行号转字符串后做4位右对齐,拼接行内容时去掉原行末尾换行避免重复空行 content = f"{str(lineNo).rjust(4)}> {line.rstrip('\n')}\n" g.write(content)
如果习惯用格式化语法简化写法,拼接行的代码可以替换成更简洁的写法,效果完全一致:
content = f"{lineNo:4d}> {line.rstrip('\n')}\n"
如果需要同时在控制台看到输出效果,在g.write(content)下面加一行print(content, end='')即可,不要把print的返回值拿来做字符串拼接。
内容的提问来源于stack exchange,提问作者Steven Grullon
相关产品推荐
相关产品推荐

