2016-06-23 136 views
1

有沒有比使用讀/寫任何文件(如txt文件等)更方便的方法來寫入python文件。Python - 寫入python文件?

我的意思是python知道python文件的結構究竟是什麼,所以如果我需要寫入它,也許有一些更方便的方法來做到這一點?

如果不存在這樣的方式(或者是太複雜),那麼會有什麼最好的辦法通常修改Python文件只是用(下面的例子)正常write

我有很多我的子目錄這些文件叫做:

__config__.py

這些文件作爲配置。他們有未分配的Python字典,像這樣:

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

所以我需要做的,是寫那些__config__.py文件的新版本(例如'version': '1.0.0')。

更新

更具體地講,因爲沒有與這樣的內容Python文件:

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

現在運行一些Python腳本,它應該寫入修改所給定的Python文件字典和寫後,輸出應該是這樣的:

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

所以換句話說,寫應該o只需修改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實用程序,可用於文本轉換,但更常用於查找和替換。 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 .inf' – scarecrow

0

爲了修改配置文件,你可以簡單地折騰這樣的:

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縮進。因此,您的評論+1。 – Soheil

+0

但是,如果代碼僅包含*字典和一些註釋,則不會有縮進。 –