2017-09-28 12 views
0

私はテキストファイルを持っています。私はpython v3.6を使用してテキストファイルを1行ずつ読み込み、各行にサブストリングを追加して、既存の行を1行ずつ追加したストリングに置き換えたいと考えています。Pythonのテキストファイルを一行ずつ読み込んで置き換えるコードが間違っていますか?

ここでは、元のテキストファイルを示します。

1,2,3 
4,5,6 

希望の出力テキストファイルは次のようになります。

appended_text,1,2,3 
appended_text,4,5,6 

これは私のコードの様子です。

with open(filename, 'r+') as myfile: 
    for line in myfile: 
     newline = "appended_text" + "," + line    
     myfile.write(newline) 

私は自分が望むものを得られませんでした。代わりに、ファイルの最後に大量のテキストが追加されました。コードはどのように変更する必要がありますか?私が欲しいものを実装するためのより良い方法はありますか?

+1

は、重複質問を見つけるためにあなたの@SiHaをありがとうございます。 – alexis

+2

PS。最良の解決策はおそらく 'fileinput'モジュールでしょう。リンクされた質問の* second *答えを見てください。 – alexis

答えて

4

ファイル内に「既存の行を置き換える」というものはありません。あなたがしたいことについては、変更された内容で新しいファイルを作成し、古いファイルを新しいファイルに置き換えなければなりません。例コード:

with open("old.file") as old, open("new.file", "w") as new: 
    for line in old:   
     line = modify(line.lstrip()) 
     new.write(line + "\n") 
os.rename("new.file", "old.file") 
+0

@chepner thx(s/move/rename/fix;) –

-1

私はあなたがあなたのforループの前にmyfile.readlines()を置く必要があると思っています。

+1

"解決策"を試しましたか? –

+0

はい、あります。実際、Kleo Gは上記のより明確な方法で私の答えを確認しています。 –

+2

彼は何も確認しなかった。 opはファイルを1行ずつ読み込みます。 –

2

一般に、このような場所でファイルを変更することはできません。代わりに、新しいファイルにコピーを書き込んだ後、元のファイルと新しいファイルを置き換えてください。ここで

with open(filename, 'r') as myfile: 
    with open("copy", 'w') as newfile: 
     for line in myfile: 
      newline = "appended_text" + "," + line    
      newfile.write(newline) 

os.rename("copy", filename) 
+0

これは実際に受け入れられる回答である必要があります。 –

+0

ええと、私たちは本質的に同じ答えを持っています。それを書く前にユーザーが '改行 'するのは大変重要ではありません。 – chepner

1

は、私がどうなるのかです:たとえば

with open(filename, 'r+') as f: 
    lines = [] 
    for line in f: 
     lines.append("appended_text" + "," + line) 
    f.seek(0) 
    for line in lines: 
     f.write(line) 

:前

にsample.txt:

hello 
there 
world 

コード:

fp = r"C:\Users\Me\Desktop\sample.txt" 
with open(fp, 'r+') as f: 
    lines = [] 
    for line in f: 
     lines.append("something," + line) 
     lines.append(line.strip() + ",something\n") 
    f.seek(0) 
    for line in lines: 
     f.write(line) 

sample.txtの後:

something,hello 
hello,something 
something,there 
there,something 
something,world 
world,something 

ノートのカップル:

  1. これは想定していますが、各行の先頭に追加しようとしています。したがって、改行('\n')は、各行の元の内容で保持されます。最後に追加する場合は、lines.append(line.strip() + "," + "appended_text")に変更します。
  2. おそらく"appended_text"",""appended_text,"を組み合わせることができます。 "appended_text"appended_text = "something"のような変数でない限り。
  3. 質問の解決策として文脈上正しいものの、私は、希望の変更を加えて新しいファイルを作成し、古いものを新しいものと入れ替えることを、他の回答で推奨するように考えます。
+1

これは安全ではありません。書き込み中にエラーが発生した場合は、破損したファイルを作成する可能性があります。 *ファイル全体が安全に書き込まれるようにしてから、古いファイルを新しいファイルに置き換えることが一番簡単です。 – chepner

+0

@chepnerどのようなエラーが発生しますか?コンテナ内の値の反復と格納、シークと上書きは、 '' w ''モードでの読み込みと切り捨て後に同じファイルを開くことと変わりありません。 – pstatix

+0

そうです。どちらも安全ではありません。 IOエラーはほとんど定義できません。新しいファイルが完全に書き込まれるまで元のファイルを上書きする危険性はありません。 – chepner

1

あなたが同じファイルに書き込みたい場合は、次の

f = open(filename, 'r') 
lines = f.readlines() 
f.close() 

lines = ['appended_text, ' + l for l in lines] 

f = open(filename, 'w') 
f.writelines(lines) 
f.close() 
+1

これは本質的にbruno desthuilltiersと同じことですが、元のファイル全体を最初にメモリに読み込むという追加費用がかかります。 – chepner

+0

(書き込みエラーが発生した場合は、元のファイルを部分的に上書きする危険があります) – chepner

+0

@MrPyCharmこれを100Goファイルで実行してみてください;) –

関連する問題