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

Python搜索文本文件匹配关键词提取数值及报错解决

问题根因

你调用get_values函数时传入的第一个参数copy是已经打开的文件对象(类型为_io.TextIOWrapper),但函数定义要求第一个入参是文件路径字符串,函数内部已经内置了open(filename)的文件打开逻辑,传入已打开的文件对象就会触发类型不匹配错误。

补充说明:你当前的实现思路是正确的,这种固定词条,数值的行格式不需要用到re库,直接用字符串split处理效率更高,逻辑也更简单。

解决方法

方案1:直接传入文件路径(最推荐)

把调用部分的代码改成传入你的纯文本数据文件的实际路径字符串即可:

# 把引号内的路径替换为你本地数据文件的真实路径
result = get_values("your_data_file.txt", search_for)

方案2:修改函数适配已打开的文件对象

如果你确实需要提前打开文件再传入函数,可以调整函数逻辑去掉内部打开文件的步骤:

def get_values(file_obj, search_terms: list) -> dict:
    """Searches the given file object for the given search terms and returns found values."""
    dct = {}
    for line in file_obj:
        term, value = line.strip().split(',')
        if term in search_terms:
            dct[term] = float(value)
    if len(dct) != len(search_terms):
        dct.update({k: None for k in search_terms if k not in dct})
    return dct

# 调用时直接传入已打开的copy文件对象即可,注意文件需要自行关闭
result = get_values(copy, search_for)

额外优化建议

如果你的数据规模很大,且需要多次执行搜索操作,建议一次性把全量数据读入内存缓存,后续搜索直接查缓存,不用每次遍历整个文件,性能提升会非常明显,同时也能处理词条含逗号、文件有空行的异常情况:

# 全局缓存初始化,仅需要执行一次读文件操作
def init_data_cache(filename: str) -> dict:
    cache = {}
    with open(filename, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            # 跳过空行
            if not line:
                continue
            # 加maxsplit=1避免词条本身包含逗号的场景下出错
            term, val = line.split(',', 1)
            cache[term] = float(val)
    return cache

data_cache = init_data_cache("你的数据文件路径.txt")

# 后续搜索直接查字典,时间复杂度O(1)
v1_val = data_cache.get(v1, None)
v2_val = data_cache.get(v2, None)

内容的提问来源于stack exchange,提问作者alec22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:45:08