Python读取文本生成用户名时while循环不加break无法停止且仅读首行问题
问题根因
- 循环无法终止:你使用了
while True无限循环结构,读取到文件末尾(返回空字符串)时没有对应终止循环的逻辑,导致循环会一直执行。 - 仅能读取/打印第一行:实际是读取到文件末尾后,
line为空不会进入else分支更新fname/lname/uname变量,变量会保留上一次读取的有效值,程序会无限重复打印最后一行的内容,视觉上看起来只读到了第一行。
修正方案
要求不允许使用break关键字,我们直接将读取行是否为空作为while循环的判断条件,读取到文件末尾时循环会自动终止,无需额外跳出逻辑。同时调整处理逻辑的位置,避免空行时变量未定义的报错。
修正后完整代码
def get_parts(s): lname, fname, code = s.rstrip().split(',') # lstrip()+rstrip()可直接简化为strip(),效果一致 lname = lname.strip() fname = fname.strip() code = code.strip() return (fname, lname, code) def make_user(fname, lname, code): uname = fname[0:2].lower() + lname[0:2].lower() + code[-3:] return uname def main(): f = open('clients.txt', 'r') print('{:<20s} {:<10s}'.format('Client', 'Username')) print('=' * 31) # 先读取第一行,作为循环初始条件 line = f.readline() while line: # 跳过文件中可能存在的空白行 if line.strip() == "": line = f.readline() continue fname, lname, code = get_parts(line) uname = make_user(fname, lname, code) print('{:<20}{:<10}'.format(fname + ' ' + lname, uname)) # 读取下一行,为空时自动退出循环 line = f.readline() f.close() if __name__ == '__main__': main()
可选优化
更推荐用with关键字管理文件句柄,无需手动调用close(),可避免异常场景下的文件资源泄露,示例如下:
def main(): with open('clients.txt', 'r') as f: print('{:<20s} {:<10s}'.format('Client', 'Username')) print('=' * 31) line = f.readline() while line: if line.strip() == "": line = f.readline() continue fname, lname, code = get_parts(line) uname = make_user(fname, lname, code) print('{:<20}{:<10}'.format(fname + ' ' + lname, uname)) line = f.readline()
内容的提问来源于stack exchange,提问作者RoboC
相关产品推荐
相关产品推荐

