通过python编辑配置文件

通过python编辑配置文件,python,file-io,python-3.x,configuration-files,text-manipulation,Python,File Io,Python 3.x,Configuration Files,Text Manipulation,我需要通过python编辑一个配置文件,我尝试在stackoverflow和google上搜索,但它们没有涵盖我的情况,因为我需要替换文件中的行并在搜索中执行匹配 此外,我发现的内容包括如何为一行执行替换,我将在文件中执行至少8行替换,我想知道是否有比总共放置10行替换(foo,bar)更干净、更优雅的方法 我需要“匹配”行,如“ENABLEPRINTER”、“PRINTERLIST”、“PRNT1.PORT”。 我想匹配这些文本并忽略下面的内容(例如:“=PRNT1,PRNT2”) 所以我会这

我需要通过python编辑一个配置文件,我尝试在stackoverflow和google上搜索,但它们没有涵盖我的情况,因为我需要替换文件中的行并在搜索中执行匹配

此外,我发现的内容包括如何为一行执行替换,我将在文件中执行至少8行替换,我想知道是否有比总共放置10行替换(foo,bar)更干净、更优雅的方法

我需要“匹配”行,如“ENABLEPRINTER”、“PRINTERLIST”、“PRNT1.PORT”。 我想匹配这些文本并忽略下面的内容(例如:“=PRNT1,PRNT2”)

所以我会这样做

replace('ENABLEPRINTER', 'y')
replace('PRINTERLIST', 'PRNT3) 
该文件如下所示:

ENABLEPRINTER=n
PRINTERLIST=PRNT1, PRNT2

PRNT1.PORT=9600
PRNT1.BITS=8
还要注意这些文件大约有100行,我需要编辑其中的10行

非常感谢你的帮助

更新

使用@J.F.Sebastian发布的代码,我现在得到以下错误:

configobj.ParseError: Parse error in value at line 611.
文件的第611行是:

log4j.appender.dailyRollingFile.DatePattern='.'yyyy-MM-d
所以问题出在"性格"上

如果我注释掉那一行,脚本与@J.F.Sebastian发布的代码配合得很好。

如果文件是格式的,那么您可以使用:

它不是很健壮,但是各种各样的修复方法可能会使下一个来的人受益


要在短字符串中多次替换,请执行以下操作:

for old, new in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]:
    some_string = some_string.replace(old, new)
要替换配置文件中的变量名称(使用):

如果通过
replace('ENABLEPRINTER','y')
表示将
y
分配给
ENABLEPRINTER
变量,则:

import configobj

ENCODING='utf-8'
conf = configobj.ConfigObj('test.conf', raise_errors=True,
    file_error=True,           # don't create file if it doesn't exist
    encoding=ENCODING,         # used to read/write file
    default_encoding=ENCODING) # str -> unicode internally (useful on Python2.x)

conf.update(dict(ENABLEPRINTER='y', PRINTERLIST='PRNT3'))
conf.write()

似乎
configobj
与以下内容不兼容:

name = '.'something
你可以引用它:

name = "'.'something"
或:


conf.update()

for name, value in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]:
    conf[name] = value
之前:

ENABLEPRINTER=n 
PRINTERLIST=PRNT1, PRNT2  

PRNT1.PORT=9600 
PRNT1.BITS=8
ENABLEPRINTER=n 
PRINTERLIST=PRNT1, PRNT2  

PRNT1.PORT=9600 
PRNT1.BITS=8
之后:

y=n 
PRNT3==PRNT1, PRNT2  

734=9600
PRNT1.BITS=8
ENABLEPRINTER=y 
PRINTERLIST=PRNT3

PRNT1.PORT=8310 
PRNT1.BITS=8
太简单了,无法确定。说出错误或弱点是什么

正则表达式的优点是它们可以很容易地调整到特定的情况

编辑:

我刚刚看到:

“我要做的是为变量指定一个新值”

你可以早点告诉我

你能给我举个文件前后的例子吗

编辑2

下面是更改文件中某些变量值的代码:

import re
from os import fsync

def updating(filename,dico):

    RE = '(('+'|'.join(dico.keys())+')\s*=)[^\r\n]*?(\r?\n|\r)'
    pat = re.compile(RE)

    def jojo(mat,dic = dico ):
        return dic[mat.group(2)].join(mat.group(1,3))

    with open(filename,'rb') as f:
        content = f.read() 

    with open(filename,'wb') as f:
        f.write(pat.sub(jojo,content))



#-----------------------------------------------------------

vars = ['ENABLEPRINTER','PRINTERLIST','PRNT1.PORT']
new_values = ['y','PRNT3','8310']
what_to_change = dict(zip(vars,new_values))


updating('configfile_1.txt',what_to_change)
之前:

ENABLEPRINTER=n 
PRINTERLIST=PRNT1, PRNT2  

PRNT1.PORT=9600 
PRNT1.BITS=8
ENABLEPRINTER=n 
PRINTERLIST=PRNT1, PRNT2  

PRNT1.PORT=9600 
PRNT1.BITS=8
之后:

y=n 
PRNT3==PRNT1, PRNT2  

734=9600
PRNT1.BITS=8
ENABLEPRINTER=y 
PRINTERLIST=PRNT3

PRNT1.PORT=8310 
PRNT1.BITS=8

不过,我在这里找到了python 3.x端口。@mstefan:set
raise\u errors=True
用于
ConfigObj()
.write()
调用。在
ConfigObj()
调用中显式设置字符编码。“不起作用”太模糊了:“test.conf”文件中有什么?你得到了什么,你期望看到什么(用正确输入/输出的例子更新你的问题)?
sys.version
configobj.\uuuuu version\uuuuu
包含什么?我的印象是mstefan想要更改变量的值,而不是变量名。(尽管他没有指定要更改的内容。)@J.F.Sebastian:raise_errors帮助意识到它失败了,因为im编辑的conf文件有两行“symbol:dateformat=”。“yyyy-MM-dd-ascicode=”,165所以它给了我一个“ParseError:parse error in value at line X”抱歉,格式化把我的信息搞乱了。我想说的是,有几行带有“符号”,这似乎与ConfigObj不太协调。有没有关于如何绕过这些路线的想法?嗨!谢谢你非常详细的回答!很抱歉,我的问题造成了这么多的混乱,我在解释自己时做得很糟糕。您上次发布用于更改文件中某些变量的代码对我不起作用。我收到了以下错误:回溯(最近一次调用上次):文件“D:\script\editconf.py”,第26行,在更新f.write(pat.sub(jojojo,content))时('printer.properties',what_to_change')文件“D:\script\editconf.py”,第16行TypeError:无法在字节上使用字符串模式,如object@mstefan您是否使用Python 3.x?@mstefan尝试定义
RE=b'(“+”|“.join(dico.keys())+”)\s*=)[^\r\n]*?(\r?\n | \r)
或类似的内容。我使用Python2.7,无法进行测试。也许,因为RE是一个agregion,它必须是
RE=b'(“+b'|'.join(dico.keys())+b')\s*=)[^\r\n]*?(\r?\n | \r)
。也许dico的键也必须是字节?有一种方法使用“ConfigParser”专门更改python“ini”文件的设置。虽然很实用,但是通过删除注释完全更改了文件,所以当我们想要更改python“ini”文件时,我放弃了这里提出的方法!有关更多信息,请参阅。
ENABLEPRINTER=y 
PRINTERLIST=PRNT3

PRNT1.PORT=8310 
PRNT1.BITS=8