You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:04:35