2017-11-22 11 views
2

読みやすくするために、SQLコードをフォーマットするためのpythonスクリプトを作成しようとしています。Python:テキストファイルの特定の単語を大文字にする

例えば、特定の小文字の単語を大文字に変換する:select - > select

私はこれをPythonの読み書き機能を使って実行しようとしています。しかし、私は立ち往生しています。ここに私のコードは次のとおりです。

words = ['select', 'from', 'where'] 
w = open('03_TextUpper.txt', 'w') 

with open('03_TextLower.txt', 'r') as file: 

    for line in file: 
     for word in line.split(): 
      if word in words: 
       w.write(word.upper()) 

    w.write(line) 

これは、特定の単語の大文字を出力しますが、小文字の単語を削除しません。

これをPythonで書くには良い方法がありますか?

答えて

1

は二つの段階です:

words = ['select', 'from', 'where'] 

with open('03_TextUpper.txt') as f_input: 
    text = f_input.read() 

with open('03_TextUpper.txt', 'w') as f_output: 
    for word in words: 
     text = text.replace(word, word.upper()) 

    f_output.write(text) 

まず、メモリにファイル全体を読み、必要な変更を行います。次に、ファイルを開いて書き込みを行い、書き戻します。

これはPython文字列replace()を使用して、各単語を大文字の代わりに置き換えます。これは、ファイルを分割する必要なく、1つのファイル全体に対してこれを行います。


これは、スポットワード境界に正規表現を使用することで改善することができます。

import re 

words = ['select', 'from', 'where'] 
uppercase = lambda x: x.group(1).upper() 
re_replace = re.compile(r'\b({})\b'.format('|'.join(words))) 

with open('03_TextUpper.txt') as f_input: 
    text = f_input.read() 

with open('03_TextUpper.txt', 'w') as f_output: 
    f_output.write(re_replace.sub(uppercase, text)) 

正規表現は、単一の呼び出しで代替の全てを実行することができます。

+0

これは素晴らしいです!ただし、このコードは単語リストの文字の組み合わせを置き換えます。たとえば、words = ['select'、 'from'、 'where'、 'in']の場合、取得などの 'in'を含む単語はobtaINになります。 – Felix

+0

通常、それを止めるために正規表現が使用されます。私はそれを使用するように更新しました。 –

0

同じインスタンスで読み書きを開始しています。読み込み関数を閉じて、新しい書き込み関数を開いて問題を解決することができます。私はあなたがこれを行う示唆

0

あなたは一度ファイルを反復して、出力ファイルに生成されたリストを書き込むことができます。

words = ['select', 'from', 'where'] 
data = [i.strip('\n').split() for i in open('03_TextLower.txt')] 
new_words = [[b for b in i if b.lower() in words] for i in data] 

with open('03_TextUpper.txt', 'w') as f: 
    for line in new_words: 
     for word in line: 
      f.write("{}\n".format(word)) 
0

サードパーティのライブラリsqlparseはこれを行います。

>>> sql = 'select * from foo where id in (select id from bar);' 
>>> print sqlparse.format(sql, reindent=True, keyword_case='upper') 
SELECT * 
FROM foo 
WHERE id IN 
    (SELECT id 
    FROM bar); 
関連する問題