目前我有一个程序,它接受一个文本文件作为设置参数。文本文件的格式如下:
我想在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")
我是一个菜鸟程序员的前言,所以任何帮助或指导在正确的方向将不胜感激。
发布于 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)
发布于 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
将是文本文件中的整个字符串。
发布于 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
https://stackoverflow.com/questions/51663279
复制相似问题