2012-03-16 5 views
0

特定の式で始まるすべての行(例:<Output>)を出力パスに置き換えたいとします。私を見つけて、ファイル内のすべての出現で、文字列を別の文字列に置き換えPythonスクリプトを動作するようになっている - のようなもの:検索パターンを含む行を完全に別の行に置き換えます。

text = open(path).read() 
if output_pattern in text: 
    open(path, 'w').write(text.replace(pattern, replace)) 

私はその行全体を置き換える何かをtext.replace(pattern, replace)を交換したいと思いますがpatternreplaceが含まれています。私はいくつかのことを試み、悲惨に失敗しました。

注:私は私の失敗の

一つは、ラインのパターンを交換しました...続きを読むが、かなりのpythonを書き込むことはできません。実際には、ファイル全体が必要なだけ何度も置き換えパターンで置き換えられました...再帰的な検索を行っていたので面白くありませんでした(以前の試み、ある文字列を別の文字列で置き換える、私は勇気を出して目標ディレクトリを自分の仕事の根幹に設定しました)

他の素晴らしい例があり、行ごとに読み込んで出力ファイルに書き込んだ後、出力ファイルを入力にコピーしますファイルを作成していますが、エラーが発生しました。

私が検索したいパターン(と特に私が置きたいもの)にバックスラッシュを含む多くの特殊文字が含まれている可能性があるので、本当に正規表現を使いたくないのですが、必要に応じてエスケープすることができます。メモリ使用量のため

text = open(path).read() 
new_text = '\n'.join(replace if line.startswith(pattern) else line 
           for line in text.splitlines()) 
open(path, 'w').write(new_text) 

または最適化を、そしてもう少し慣用句であるwithステートメントを使用して::彼らはpatternで始まる場合replaceと行を置き換えるために

+0

2つのテキストファイルを使用してください.1つは* read *、もう1つは* write *です。 'with'、' True'、 'readline()'を使って設定するのが最良です。最初の10行だけのテストファイルを作成し、それを動作させてから実際のターゲット上で実行することができます。 [ここをクリック](http://effbot.org/zone/readline-performance.htm)を参照してください。 – Droogans

答えて

3

with open(input_path) as text, open(output_path, 'w') as new_text: 
    new_text.write(''.join(replace if line.startswith(pattern) else line 
           for line in text)) 

あなたを」後者の例が期待どおりに動作するように、replaceに改行文字(\n)が含まれていることを確認します。

+0

それはテキストファイル、特に '.read()'に大きくなるかもしれません。 – Droogans

+0

十分に真実で、私は最適化されより慣用的な例を与えます。 – zeekay

+0

@ zeekay:新しいバージョンはまだファイル全体をメモリに読み込み、それを書き込む前に改訂されたバージョンを作成しませんか? – DSM