13

Python を使用して構成ファイルを編集する必要があり、stackoverflow と google で検索しようとしましたが、ファイル内の行を置き換えて検索で一致を実行する必要があるため、状況をカバーしていません。

また、私が見つけたものは、1行でそれを行う方法をカバーしています.ファイルで少なくとも8行の置換を実行します.10を配置するよりもクリーンでエレガントな方法があるかどうかを知りたい、バー) 行全体。

「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 行を編集する必要があることに注意してください。

ご助力ありがとうございます。

更新

@JF Sebastian が投稿したコードを使用すると、次のエラーが発生します。

configobj.ParseError: Parse error in value at line 611.

ファイルの 611 行目は次のとおりです。

log4j.appender.dailyRollingFile.DatePattern='.'yyyy-MM-d

したがって、問題は ' 文字にあります。

その行をコメントアウトすると、スクリプトは @JF Sebastian によって投稿されたコードで正常に動作します。

4

2 に答える 2

7
import re 
pat = re.compile('ENABLEPRINTER|PRINTERLIST|PRNT1.PORT')

def jojo(mat,dic = {'ENABLEPRINTER':'y',
                    'PRINTERLIST':'PRNT3',
                    'PRNT1.PORT':'734'} ):
    return dic[mat.group()]

with open('configfile','rb+') as f:
    content = f.read()
    f.seek(0,0)
    f.write(pat.sub(jojo,content))
    f.truncate()

前:

ENABLEPRINTER=n 
PRINTERLIST=PRNT1, PRNT2  

PRNT1.PORT=9600 
PRNT1.BITS=8

後:

y=n 
PRNT3==PRNT1, PRNT2  

734=9600
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=y 
PRINTERLIST=PRNT3

PRNT1.PORT=8310 
PRNT1.BITS=8
于 2011-03-14T23:06:10.543 に答える
4

ファイルがjava.util.Propertiesフォーマットされている場合は、次を使用できますpyjavaproperties

from pyjavaproperties import Properties

p = Properties()
p.load(open('input.properties'))

for name, value in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]:
    p[name] = value
p.store(open('output.properties', 'w'))

それほど堅牢ではありませんが、さまざまな修正により、次に来る人々に利益をもたらす可能性があります。


短い文字列で複数回置換するには:

for old, new in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]:
    some_string = some_string.replace(old, new)

構成ファイル内の変数名を置き換えるには ( configobjmoduleを使用):

import configobj

conf = configobj.ConfigObj('test.conf')

for old, new in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]:
    conf[new] = conf[old]
    del conf[old]
conf.write()

変数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"

または:

name = '.something'

または

name = .something

conf.update()次のようなことを行います:

for name, value in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]:
    conf[name] = value
于 2011-03-14T13:46:53.870 に答える