2016-09-20 17 views
0

テキストの小さな部分をテキストブロックに置き換えようとしています。私は、このテキストブロックがpythonのreplace関数を使って置き換えられることを期待しています。私は本当にsedこの仕事を得るために使用したいと思いますが、私はWindowsマシンです。とにかくここに私のスクリプトは、テキストのブロックが置き換えられていない理由はわかりません。特定のテキストをテキストブロックに置き換えます。

# Change the current working directory to IDX location 
import os 
print os.getcwd() 
os.chdir(##location of my text files##) 
print os.getcwd() 

#Read file names 

com_line=raw_input("File name please:") 
contents=[] 
strs = '#DREFIELD IDOL_SOURCE="idol source"\n#DREFIELD IDOL_TAXONOMY="taxonomy data"\n #DREFIELD IDOL_CATEGORY="IDOL_CATEGORY"\n #DREFIELD IDOL_PROMOTION="idol_promotion"\n #DREFIELD IDOL_PROMOTION_TERM="IDOL_PROMOTION_TERM"\n #DREFIELD IDOL_WHATSNEW="IDOL_WHATSNEW"\n #DREFIELD IDOL_SUMMARY="IDOL_SUMMARY"\n #DREFIELD IDOL_URL="IDOL_URL DATA"\n #DREFIELD IDOL_FORMNUMBER="IDOL_FORMNUMBER"\n #DREFIELD IDOL_DESCRIPTION="IDOL_DESCRIPTION DATA"\n#DRESECTION 0\n' 
with open(com_line) as f: 
    contents.append(f.readlines()) 
f.close 

#Writing to file 
f2 = open("test.idx", 'w') 

for content in contents: 
    for s in content: 
     if s == '#DRESECTION 0\n': 
      s.replace("#DRESECTION 0\n", strs) 
     f2.write("%s" % s) 
f2.close 

私はこのコードをテストし、条件文も入力しています。なぜ必要なテキストが#DRESECTION 0\nの代わりにstrsに置き換えられないのか不思議ですか?また、私はいくつかのギグの価値がある大規模なテキストファイルのこの操作を行うために探しています。 Pythonで大きなテキストファイルを読む良い方法はありますか?

答えて

3

Pythonのスティングは不変です。文字列オブジェクトが作成されると、変更することはできません。ただし、古い文字列に基づいて新しい文字列を作成することはできます。

s.replaceを呼び出すときには、sは変更されません。理由はありません。代わりに、str.replaceメソッドは新しい文字列を返します。あなたはs = s.replace(...)を実行することができ、それはうまくいくはずです。ただし、新しい文字列に名前を再バインドするだけでは、ある文字列の内容全体を別の文字列に置き換える必要はありません。

私が使用することをお勧め:

if s == '#DRESECTION 0\n': 
     s = strs 
    f2.write(s) 

を私はまたwriteコールを変更しました。文字列全体を書きたいので、ここで文字列置換を使う必要はありません。引数としてsを渡すだけです。

あなたのコードと他のいくつかのマイナーな問題があります。

は、たとえば、あなただけそれらを命名、あなたのファイルにcloseメソッドを呼び出していません。実際にファイルを閉じる場合は、f2.close()が必要です。しかし実際にはwithの文が自動的にファイルを閉じるので、f2の場合はwithを使用し、closeのマニュアルの場合は気にする必要はないため、実際にfのために行う必要はありません。

contentsはネストされたリスト(外側のリストに1つの項目のみ)である必要はあまりないようです。最初に空のリストに行のリストを入力するのではなく、appendではなく、contents = f.readlines()を実行することをお勧めします。これにより、後のコードでループの1つを取り除くことができます。

関連する問題