Python中跟踪标准输入(stdin)行号的优雅实现方法
嘿,这个问题我太熟了!其实Python里有个超适合的工具能帮你搞定,完全不用自己手动维护计数器——就是enumerate()函数,这绝对是最Pythonic的实现方式了。
先给你看直接能用的代码:
import sys # enumerate的start参数设为1,让行号从1开始计数,符合日常习惯 for line_num, line in enumerate(sys.stdin, start=1): # 用rstrip()去掉行尾的换行符,避免输出时多空一行 print(f"{line.rstrip()} | 行号: {line_num}")
为啥这个好用?因为enumerate()本来就是专门用来遍历可迭代对象(比如这里的sys.stdin),同时返回索引(也就是你的行号)和元素本身的。设置start=1是为了跳过默认的0起始计数,直接从1开始,和我们平时看的行号逻辑一致。
至于你之前试的tell()方法,确实不行——因为标准输入是流式的,它不支持随机访问(也就是seek操作),所以调用tell()会抛出非法seek的错误,而且它本来就只是跟踪字节数,不是行数,完全不适合你的需求。
可能你会好奇,那普通文件对象不是有lineno()方法吗?但sys.stdin不一样,它的lineno()方法并不会随着你读取行而自动递增(因为流式输入没有固定的行位置记录),所以这个方法也派不上用场。
所以结论就是:用enumerate()就对了,简洁、优雅,完全符合Python的设计哲学,不用自己写计数器多此一举。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

