首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果在Python中包含用户输入的特定字符串,如何更新文本文件中的行?

如果在Python中包含用户输入的特定字符串,如何更新文本文件中的行?
EN

Stack Overflow用户
提问于 2018-08-03 07:09:13
回答 3查看 118关注 0票数 -1

目前我有一个程序,它接受一个文本文件作为设置参数。文本文件的格式如下:

我想在Python中做的是能够解析文件。我想读取每一行,并检查它是否包含特定的字符串,如果该行包含该字符串,则能够在该行的末尾添加/更新用户输入的文本。

例如,在文本文件中找到"PRIMER_PRODUCT_SIZE_RANGE=“(突出显示),我想将其从"PRIMER_PRODUCT_SIZE_RANGE=100-300”更新为例如"PRIMER_PRODUCT_SIZE_RANGE=500-1000“。我希望能够对几个参数(我根据自己的需要选择的参数)执行此操作。

我研究过的一些工具包括fileinput模块,执行常规的文件打开/写入(显然我不能进行就地编辑),以及我发现的一个称为in_place module的模块。

我有一些使用in_place模块的初步代码:

def SettingFileParser(filepath):
    with in_place.InPlaceText(filepath) as text_file:
        for line in text_file:
            if 'PRIMER_PRODUCT_SIZE_RANGE=' in line:
                text_file.write("idk what to put here")

我是一个菜鸟程序员的前言,所以任何帮助或指导在正确的方向将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-03 10:16:05

您需要打开文件进行读取(默认),然后需要打开一个文件进行写入:

def SettingFileParser(filepath):
    with open(filepath, 'r') as read_file:
        lines = read_file.readlines():
        with open(filepath, 'w') as write_file:
            for line in lines:
                if line.startswith('PRIMER_PRODUCT_SIZE_RANGE='):
                    # keep the line the same except the part needing replacement
                    write_file.write(line.replace('100-300','500-1000'))
                else:
                    # otherwise just write the line as is
                    write_file.write(line)
票数 0
EN

Stack Overflow用户

发布于 2018-08-03 13:56:02

对于这项任务,regular expressions是最好的选择。我向你推荐this post

具体地说,像这样的东西可能会起到作用:

import re
# read in file here...
re.sub(r"PRIMER_PRODUCT_SIZE_RANGE=[0-9,-]*", "PRIMER_PRODUCT_SIZE_RANGE=500-1000", s)

在这里,s将是文本文件中的整个字符串。

票数 0
EN

Stack Overflow用户

发布于 2018-08-03 15:08:35

您可以使用re更改/操作字符串(explanation of this regex on external site):

data = """
# PRIMER_PRODUCT_SIZE_RANGE=xxx-yyy
PRIMER_PRODUCT_SIZE_RANGE=100-300
PRIMER_NUM_RETURN=3
PRIMER_MAX_END_STABILITY=9.0

PRIMER_MAX_HAIRPIN_TH=24.0
"""

import re

def change_parameter(data, parameter, new_value):
    return re.sub(r'^(\s*(?<!#)\s*{}\s*)=.*$'.format(parameter), r'\1={}'.format(new_value), data, flags=re.M|re.I)

data = change_parameter(data, 'PRIMER_PRODUCT_SIZE_RANGE', '100-500')
data = change_parameter(data, 'PRIMER_MAX_HAIRPIN_TH', '99.9')
print(data)

这将打印:

# PRIMER_PRODUCT_SIZE_RANGE=xxx-yyy
PRIMER_PRODUCT_SIZE_RANGE=100-500
PRIMER_NUM_RETURN=3
PRIMER_MAX_END_STABILITY=9.0

PRIMER_MAX_HAIRPIN_TH=99.9

对于读/写文件,您可以使用以下代码片段:

with open('parameters.txt', 'r', newline='') as f_in:
    data = f_in.read()

with open('parameters.txt', 'w', newline='') as f_out:
    data = change_parameter(data, 'PRIMER_PRODUCT_SIZE_RANGE', '100-500')
    data = change_parameter(data, 'PRIMER_MAX_HAIRPIN_TH', '99.9')
    f_out.write(data)

编辑:

change_parameter()的扩展版本

import re
data = """
PRIMER_PRODUCT_SIZE_RANGE=100-500 200-400
PRIMER_NUM_RETURN=3
PRIMER_MAX_END_STABILITY=9.0
"""

def change_parameter_ext(data, parameter, old_value, new_value):
    def _my_sub(g):
        return g[1] + '=' + re.sub(r'{}'.format(old_value), new_value, g[2], flags=re.I).strip()
    return re.sub(r'^(\s*(?<!#)\s*{}\s*)=(.*)$'.format(parameter), _my_sub, data, flags=re.M|re.I).strip()

data = change_parameter_ext(data, 'PRIMER_PRODUCT_SIZE_RANGE', '200-400', '500-600')
data = change_parameter_ext(data, 'PRIMER_NUM_RETURN', '3', '100-200 300-400')
print(data)

打印:

PRIMER_PRODUCT_SIZE_RANGE=100-500 500-600
PRIMER_NUM_RETURN=100-200 300-400
PRIMER_MAX_END_STABILITY=9.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51663279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档