2017-01-16 19 views
0

htmlファイルが1000件以上あります。「開く」を1回だけ使用して読み書きすることはできますか?

私がやりたい:

  • は、ファイルを読み込みます。
  • 特定の行をトリムします。
  • ファイルを上書きします(追加しません)。

次のコードが機能しました。私は「オープン」を2回使用するのは無駄だと思った。もっと簡単に書くことはできますか?

for file_path in glob.glob(os.path.join(dir, '*.html')): 
    with open(file_path, "r", encoding="utf-8") as reader: 
     html_ = reader.read() 
     replaced = html_.replace("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>", "") 
     with open(file_path, "w", encoding="utf-8") as writer: 
      writer.write(replaced) 

私が試した:

  • 'r+':これは追加です。
  • 'w+'read()メソッドは、''を返しました。

答えて

3

はい、'r+'モードでファイルを開き、(スタートに戻っseek)「を巻き戻すには、」読んだ後:あなたがからデータを削除しているので、

with open(file_path, "r+", encoding="utf-8") as f: 
    html_ = f.read() 
    f.seek(0) 
    replaced = html_.replace("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>", "") 
    f.write(replaced) 
    f.truncate() 

を私は、同様file.truncate()コールを追加しましたファイル。その呼び出しがなければ、ファイル内のすべてのデータを置き換えません。最後にはlen(removed_data)バイトが残っています。あなたが先頭に戻って求めていなかったので、'r+'を使用した場合

あなたの試みは失敗した(ので、書き込みは、読み取りがファイルの終わり、つまり、停止時点で開始)、および'w+'最初が(そう設定ファイルを切り捨て長さを0にして内容を削除する)。

代わりに、fileinput moduleを使用することもできます。それはあなたがやや単純なアプローチでその場でファイルの内容を置き換えることができます:inplace=True

import fileinput 

with fileinput.input(file_path, inplace=True, openhook=fileinput.hook_encoded("utf-8")) as f: 
    html_ = f.read() 
    replaced = html_.replace("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>", "") 
    print(replaced, end='') 

は、古いファイルがあなたのため<filename>.bakバックアップに脇に移動され、印刷が元にオープンした新しいファイルに出力しますロケーション。

+0

効率に関しては、 'FileInput'を使用してその場所を変更する方が良いでしょうか? –

+1

@ JimFasarakis-Hilliard: 'FileInput'は別のファイルを作成し、それを古い場所に移動します。それは必ずしも効率的ではありません。 –

+0

ありがとうございます。そうですか。 read()を呼び出すと、ポインタが進んでいることが分かりました。そして私がwrite()を呼び出すと、ライターはその点から書き始めます。理解しやすい説明をいただきありがとうございます。 truncate()も呼び出します。 –

関連する問題