2016-06-23 16 views
1

pythonファイルに書き込むより便利な方法があります(txtファイルなどのような)任意のファイルの読み書きを使うよりも便利ですか?Python - Pythonファイルに書き込む?

私は、実際にはPythonファイルの構造が何であるかを知っています。だから、もし私がそれに書き込む必要があれば、もっと便利な方法がありますか?

そのような方法(または、それはあまりにも複雑である)が存在しない場合には、どのような通常の普通write(以下の例)を使用して、Pythonのファイルを変更するための最良の方法でしょうか?

__config__.py

これらのファイルは、設定として使用されます。

私はと呼ばれる私のサブディレクトリにこれらのファイルをたくさん持っています。そして、彼らはこのように、割り当てられていないPythonの辞書を持っている:

{ 
    'name': 'Hello', 
    'version': '0.4.1' 
} 

だから、私は何をする必要があるか、これらすべての__config__.pyに書き込みされた(例えば、'version': '1.0.0'用)の新しいバージョンをファイル。

更新

このようなコンテンツを持つPythonのファイルがあることを考えると、具体的には:現在、いくつかのPythonスクリプトを実行している

# Some important comment 
# Some other important comment 
{ 
'name': 'Hello', 
'version': '0.4.1' 
} 
# Some yet another important comment 

、それは与えられた変更のpythonファイルに書き込む必要があります辞書と書き込み後、出力は次のようになります。

# Some important comment 
# Some other important comment 
{ 
'name': 'Hello', 
'version': '1.0.0' 
} 
# Some yet another important comment 

つまり、 nly versionのキー値を変更してください。それ以外のものはすべて書き込み前の状態に保つ必要があります。

+0

コンテンツが辞書なので、それをjsonに変換して 'json.dump()'を実行するといいでしょうか? – scarecrow

+0

ファイルには、['literal_eval()'](https://docs.python.org/3/library/ast.html#ast.literal_eval)のPythonリテラルがあります。かなりの形式で書いても、別のことです。おそらく[pprint](https://docs.python.org/3/library/pprint.html)が役立つかもしれません。 –

+0

これはおそらく役に立ちますか? http://stackoverflow.com/questions/768634/parse-a-py-file-read-the-ast-modify-it-then-write-back-the-modified-source-c – Jaxian

答えて

0

私は解決策を思いついた。非常にきれいではありませんが、機能します。誰かがより良い答えを持っているなら、それを書いてください。設定ファイルを変更するために

content = '' 
file = '__config__.py' 
with open(file, 'r') as f: 
    content = f.readlines() 
    for i, line in enumerate(content): 
     # Could use regex too here 
     if "'version'" in line or '"version"' in line: 
      key, val = line.split(':') 
      val = val.replace("'", '').replace(',', '') 
      version_digits = val.split('.') 
      major_version = float(version_digits[0]) 
      if major_version < 1: 
       # compensate for actual 'version' substring 
       key_end_index = line.index('version') + 8 
       content[i] = line[:key_end_index] + ": '1.0.0',\n" 
with open(file, 'w') as f: 
    if content: 
     f.writelines(content) 
+0

なぜ 'sed'もありませんか? ;) – scarecrow

+0

sedとは何ですか? :-) – Andrius

+0

'sed'はテキスト変換に使用できる* nixユーティリティですが、より一般的にはfindとreplaceで知られています。 http://www.brunolinux.com/02-The_Terminal/Find_and%20Replace_with_Sed.html。バージョン番号を置き換えたいのであれば、これを行うコマンドは 'sed -e" s/'version': '0.4.1'/'version': '1.0.0'/g "test.cnf> new .cnf' – scarecrow

0

、あなたは、単にこのようなSTH行うことができます。ここでは印刷機能は、実際にファイルに書き込む

import fileinput 

lines = fileinput.input("__config__.py", inplace=True) 
nameTag="\'name\'" 
versionTag="\'version\'" 
name="" 
newVersion="\'1.0.0\'" 
for line in lines: 
    if line[0] != "'": 
     print(line) 
    else: 
     if line.startswith(nameTag): 
      print(line) 
      name=line[line.index(':')+1:line.index(',')] 
     if line.startswith(versionTag): 
      new_line = versionTag + ": " + newVersion 
      print(new_line) 

はお知らせ。 プリント機能による書き込みの詳細については、here

をご覧ください。

+1

'fileinput'は' inplace'で使用するのが非常に危険です。コンテキストマネージャーで使用していないので、forループで例外が発生した場合、標準出力がそのファイルにリダイレクトされる可能性があります。さらに '.strip()'行では、それらの行のPythonコードを壊すインデントを削除しています。また、スライスは正確なフレーズにも非常に依存しています。 –

+0

まあ、私は実際にはストリップが最初の場所でのpythonインデントを破る可能性があることに気づいていませんでした。 – Soheil

+0

しかし、コードに辞書といくつかのコメントだけが*含まれていれば、中断するインデントはありません。 –

関連する問題