2016-07-29 19 views
1

私はそのファイル(#)内のコメント行を削除する必要があるコメントファイルのリストを持っていて、同じファイルに書き込む必要があります。Python:コメント行を削除して同じファイルに書き込む方法は?

コメントファイル:

#Hi this the comment 
define host { 
     use    template 
     host_name  google_linux 
     address   192.168.0.12 
} 

#commented config 
#ddefine host { 
#d  use    template1 
#d  host_name  fb_linux 
#d  address   192.168.0.13 
#d} 

私は、ファイル内のコメント行を削除するために書いたコード?

コード:

>>> with open('commentfile.txt','r+') as file: 
...  for line in file: 
...  if not line.strip().startswith('#'): 
...    print line, 
...    file.write(line) 
... 
define host { 
     use    template 
     host_name  google_linux 
     address   192.168.0.12 
} 

>>> with open('commentfile.txt','r+') as file: 
...  for line in file: 
...  if line.strip().startswith('#'): 
...    continue 
...  print line, 
...  file.write(line) 
... 
define host { 
     use    template 
     host_name  google_linux 
     address   192.168.0.12 
} 

Iは、印刷出力に戻り正しいが、再び同じファイルに書き込むことができなかったことが上記二つの方法を使用してみました。ファイル内

出力:

cat commentfile.txt 
#Hi this the comment 
    define host { 
      use    template 
      host_name  google_linux 
      address   192.168.0.12 
    } 

    #commented config 
    #ddefine host { 
    #d  use    template1 
    #d  host_name  fb_linux 
    #d  address   192.168.0.13 
    #d} 

予想される出力:

cat commentfile.txt 
define host { 
       use    template 
       host_name  google_linux 
       address   192.168.0.12 
     } 

私も正規表現の方法を試してみたが、同じファイルに書き込むように動作しませんでした。

RE方法:

for line in file: 
      m = re.match(r'^([^#]*)#(.*)$', line) 
      if m: 
       continue 

任意のヒントが参考になりますか?

+4

読んでいる間にファイルに書き込むのは難しいです。ファイル全体をメモリに読み込んで操作し、一度にファイルに戻してください。それほど大きくないので、消費されるメモリは問題になりません。 – deceze

+1

小さなファイルの場合は、ファイル全体をメモリに読み込み、ファイルを閉じて処理して書き戻します。大きなファイルの場合は、ファイルを読み込み、別のファイルに書き込んだり処理したりしたら、一時ファイルの名前を元のファイルに変更します。 – Vatine

+0

@decezeファイルをループしています。しかし、いくつかのファイルは2GBの設定データを持っています。それは大丈夫ですか?もし私があなたの方法に従えば。 –

答えて

0

ループするファイルに行を書き込むことはできませんが、ループの後に元のファイルに移動できる別のファイルに書き出す必要があります。

または、読み取り中

開いているファイルが書き込み中に新しいファイルを開く いくつかの擬似コードを、メモリにすべての行を読んでクローズし、ファイルを再度開くと、新たに処理された行と行の上に

0

を書くことができますモード ループスルーして何らかの操作を行います(コメントを削除して追加する必要があるものを追加してください) 元のファイルを閉じて削除します 一時ファイルの名前を古いファイル に変更します〜のようになります

fileVar = open(file, 'r') 
tempFile = open(file, 'w') 
for line in file: 
    # do your operations 
    #you could write at the same time 
    tempFile.write(linePostOperations) 
fileVar.close() 
os.remove(filePath) 
tempFile.close() 
os.rename(tempFileName, newFileName) 
関連する問題