2017-04-25 1 views

答えて

0

多分これは動作することができます:

lines = open("file").readlines() 

n_lines = ["%s" % line for line in lines if line.strip()] 

f = open("file", "w") 
f.write("".join(n_lines)) 
f.close() 

を私はリストの内包表記を使用して、フィルタラインを使用して新しい変数を作成します。

EDIT

あなたは、各セクションの改行を追加することができた場合、これは多分動作することができます:

lines = open("file").readlines() 

n_lines = ["\n%s" % line if "[Sect" in line else line for line in lines if line.strip()] 

f = open("file", "w") 
f.write("".join(n_lines).lstrip()) 
f.close() 

EDIT 2:

私はわからないんだけど...しかし

ファイルが非常に大きく、作業するPythonが3バージョンの場合は、おそらくcパフォーマンス向上のために使用このコード:

def readfile(filepath): 
    with open(filepath, "r") as f: 
     for line in f: 
      yield line 

lines = readfile("file") 

n_lines = ["\n%s" % line if "[Sect" in line else line for line in lines if line.strip()] 

f = open("file", "w") 
f.write("".join(n_lines).lstrip()) 
f.close() 

Reference

+0

%:n_lines = [line.strip()ならば行内の行] – Dima

+0

はい、 '%'なしで 'line'の値を得ることができます。 – kip

+1

素晴らしいです。各セクションの後に空白行が1つ残っていれば完璧ですが、もう少し複雑になると思います。たぶん、各 "["と "\ n ["最初の "[" – Dima

0

簡単にgrep

$ grep -v "^\\s*$" foo > bar 

のようなツールを使用していますが、this answerをチェックアウトし、その後のPythonを使用する必要があります。

+0

はそれだけのConfigParserモジュールは、独自に整頓のiniファイルを保持していないことを奇妙なようです。 – Dima

+0

@Dima:それはクールな機能だろう。 – fiacre

+0

そうするスキルはありませんが、公式のconfigparserライブラリにそのような機能を追加するのはどれほど難しいでしょうか? – Dima

0

はジャストsedを使用します。

sed '/^$/d' myfile.ini

あなたは厳密にpythonのソリューションを使用したい場合、あなたは、一時ファイルを作成する非空行をコピーして、交換することができ

+0

sed。それは基本的なPythonライブラリの一部ですか? – Dima

+0

おそらく '-i'がインプレースで動作します。 –

+0

@Dima:これは標準のUnixツールです。LinuxまたはOS Xの場合、デフォルトでインストールされます。 –

1

の作品ファイル。

from tempfile import mkstemp 
from os import close 
from shutil import move 

def replace(filename, name, new_value): 
    fd, path = mkstemp() 
    with open(path,'w') as tmpfile: 
     with open(filename) as csv: 
      for line in cvs: 
       if line.strip()!="": 
        tmpfile.write(line) 
    close(fd) 
    move(path, filename) 
関連する問題