Python读写TXT文件问题:已存在字符串却判定不存在
问题分析与解决方案
我一眼就看到问题出在哪了——你被换行符坑了!
问题根源
你写入文件的是 '123' + '\n',也就是实际存在文件里的字符串是 '123\n'(带换行符),但你判断的是 '123' 是否在集合里。这两个是完全不同的字符串,哪怕文件里已经有内容,程序也会判定"Not Existed"。
另外你排查时用的 print(line + '\n') 也会误导你:readlines() 读取的每一行本身就自带换行符,你再加一个换行,输出会多空行,反而看不清字符串的真实形态。换成 print(repr(line)) 就能清晰看到 '123\n' 这个真实内容了。
修正后的代码
首先要调整逻辑顺序:先判断是否存在,再决定是否写入(你原来的代码是先写再判断,会导致不管有没有都先追加一遍,不符合需求)。然后处理换行符的问题,推荐两种思路:
思路1:读取时去除换行符(更通用)
# 先读取文件并处理换行符 target_str = '123' file_path = './video/1.txt' with open(file_path, 'r') as o: # 去掉每行末尾的换行符,同时保留原内容(strip('\n')只删换行,不删空格) lines = [line.rstrip('\n') for line in o.readlines()] lines_set = set(lines) if target_str in lines_set: print("Existed") else: print("Not Existed") # 不存在则追加写入 with open(file_path, 'a') as f: f.write(target_str + '\n')
思路2:判断时匹配带换行的字符串(仅适用于确定每行都有换行的情况)
如果确定文件里的每行都以换行结尾,可以直接判断带换行的字符串,但这种方式灵活性差,不推荐:
target_str = '123\n' # 带上换行符 with open('./video/1.txt') as o: lines = set(o.readlines()) if target_str in lines: print("Existed") else: print("Not Existed") with open('./video/1.txt', 'a') as f: f.write('123' + '\n')
额外建议
- 全程使用
with语句管理文件句柄,它会自动帮你关闭文件,避免因异常导致文件未关闭的问题(你前面的f.open/close可以改成with写法,更安全)。 - 如果文件很大,用
readlines()会一次性加载所有内容到内存,此时可以改成逐行读取判断,更节省内存:
target_str = '123' file_path = './video/1.txt' existed = False with open(file_path, 'r') as o: for line in o: if line.rstrip('\n') == target_str: existed = True break if existed: print("Existed") else: print("Not Existed") with open(file_path, 'a') as f: f.write(target_str + '\n')
内容的提问来源于stack exchange,提问作者Xi Chen
相关产品推荐
相关产品推荐

