Python文件读写异常求助:首次运行无输出,二次运行重复写入
问题分析与解决办法
首先咱们来拆解你遇到的两个核心问题:
1. 首次运行无输出的原因
你用r+模式打开文件时,文件指针初始是停在文件开头的。当执行f.writelines(words)写完内容后,指针会自动跳到文件末尾。这时候再用for i in f读取文件,是从当前指针位置(也就是末尾)开始读,自然读不到任何内容,所以没有输出。但其实这时候文件已经被写入了一遍内容哦。
2. 第二次运行内容重复写入的原因
第二次运行时,文件已经有了第一次写入的内容。再次用r+打开文件,指针回到了开头,你又执行了一次f.writelines(words)——如果两次写入的内容长度完全一致,理论上会覆盖原有内容,但你看到内容重复,大概率是第一次运行后文件内容的长度和第二次写入的长度存在细微差异(比如换行符的隐式差异),导致旧内容的一部分没被覆盖,看起来像是被写入了两次。
修复代码的两种方案
方案一:写入后将指针移回开头(覆盖原有内容)
如果你每次运行都想覆盖文件里的旧内容,同时写完就能读取输出,只需要在写入后加一行f.seek(0)把指针移回开头就行:
with open('stavanger.txt','r+') as f: words = ['hello\n','guys\n','how\n', 'are\n','you\n'] f.writelines(words) f.seek(0) # 关键:把文件指针移回开头,这样才能读取刚写入的内容 for i in f: # 这里split(',')其实没必要,因为每行没有逗号,改成下面这样更直接 x = i.rstrip() print(x) # 如果确实需要单元素列表形式,保留split也可以,结果是['hello']这类结构 # x = i.rstrip().split(',') # print(x)
这样修改后,第一次运行就能直接输出内容,而且每次运行都会覆盖文件原有内容,不会出现重复。
方案二:追加内容而非覆盖(使用a+模式)
如果你想每次运行都把内容追加到文件末尾,那应该用a+模式,同样需要移动指针到开头才能读取整个文件的内容:
with open('stavanger.txt','a+') as f: words = ['hello\n','guys\n','how\n', 'are\n','you\n'] f.writelines(words) f.seek(0) # 移回开头才能读取所有历史内容 for i in f: x = i.rstrip() print(x)
这样每次运行都会在文件末尾新增内容,读取输出的是文件里的所有内容。
内容的提问来源于stack exchange,提问作者Yok Artık
相关产品推荐
相关产品推荐

