- ベストアンサー
Pythonで既存のテキストにデータを書き加える方法
- Pythonで既存のテキストにデータを書き加える方法について解説します。
- データを追加する際に注意する点や、上手く行かない場合の対処法についても紹介します。
- また、大容量のテキストファイルの扱いについても考慮し、効率的な方法を提案します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
COPYについては#2さんの説明にあるとおり。Pythonのcopyではありません。 1)について 「一旦全部readして」というのが少し言葉が足りなかったようです。 「一旦全部readしたものを変数等に保存しておいて」 です。 #!/usr/bin/python #-*- coding: utf-8 -*- f = open("data.txt" , "r+") data = f.read() #全部変数に取り込む f.tell() f.seek(0,0) f.tell() f.write('''ncols 1019 nrows 1923 xllcorner -67.2327777773961 yllcorner 44.63742951396 cellsize 0.000277777777779674 NODATA_VALUE -999 ''') #追加部分を書き込む f.write(data) # 続けて、とりこんだものを書き出す f.close()
その他の回答 (2)
- rinkun
- ベストアンサー率44% (706/1571)
Pythonで解決するのはむしろ面倒でしょう。コマンドラインで十分です。 まず、先頭に追加したいテキストをノートパッドなどでファイルにします。add.txtという名前にしましょう。既存のテキストはdata.txtです。 DOSプロンプトを開いて COPY /B add.txt+data.txt adddata.txt とすると、data.txtの先頭にadd.txtが追加されたファイルがadddata.txtとして作成されます。
お礼
rinkunさん、アドバイスをありがとうございます。色々とググっている時に、そんな感じの情報を目にしていたのですが、してやられた、って感じであります。
- kmee
- ベストアンサー率55% (1857/3366)
単にopenして先頭にwriteするだけではできません。 ノートパッドで言うところの「上書き入力モード」にしかなりません。 これは、Pythonに限ったことではありません。 先頭に挿入するには 1)readモードでopen→一旦全部readして、closeして、writeモードでopen (または、read/writeモードでopen→全部read→ファイルポインタを先頭に移動) →追加したい6行を出力→先程読みこんだ内容を出力 全内容を一旦読めるだけのメモリが必要 2)read/writeでopen→ファイルサイズを元の内容+追加分のサイズに変更。 元の最終位置へseek→read→現在の最終位置へseek→write 元の最終位置-1へseek→read→現在の最終位置-1へseek→write ...を繰り返し、追加分の領域を確保 →追加分を出力 seekが大量にあるので遅い 3)新規ファイルをwriteモードでオープン →追加分を新規ファイルにwrite →旧ファイルをreadでオープン→全内容について、read→新規ファイルにwrite 別ファイルができるが、効率はよい。 旧ファイルreadから新ファイルへのwriteは、一度に全内容を行わなくても、1行ずつ等でもできる。 また、あらかじめ、その6行をファイルに保存(例とし、 datahead.txt)しておいて、 コマンドプロプトのcopyコマンドを使って copy datahead.txt+data.txt data_out.txt で、data_out.txtに追加されたファイルができます。これは、3)の方法と同じです。
補足
kmeeさん、 早速のアドバイスをありがとうございます。 残念ながらプログラミング初心者で知識が乏しく、(2)のアドバイスに関しましては全く理解することができておりません。 (1)のアプローチで問題を解決しようと試みましたが、完全解決には至っておりません。 f = open("data.txt" , "r+") print(f.read()) f.tell() f.seek(0,0) f.tell() で、ポインタが先頭に来ていることを確認した後、 f.writelines("ncols 2585\n") f.writelines("nrows 9120\n") と試ました( f.write でも)。その結果、この2行は data.txt 内に書き込まれたのですが、書き込み方が挿入扱いではなく、上書き扱いにされてしまうようで、元々 data.txt 内にあったデータのいくつかが消えてしまいました。なんとか挿入扱いにする方法は無いものでしょうか? (3)のアプローチでやはり問題を解決すべく試してみました。 copy コマンドは shutil モジュール下で使うのだと思うのですが、copyコマンド datahead.txt + data.txt → data_out.txt のような使い方ができるのでしょうか? ネットや所持している Python の本を捲ってみましたが、 copy コマンドの説明としては、現在存在するファイルを別の名前で複製するための手段としての説明しか見当たらないのですが。 申し訳ございませんが、宜しければ更なるアドバイスを頂ければと思っております。よろしくお願いします。
お礼
kmeeさん、ご丁寧なスクリプト付きのご回答をありがとうございます。Pythonの本を読んだだけでは、変数に保存するとか十分に理解することがでなかったのですが、具体的な解答を示して頂き、良い勉強になりました。もちろん、この度の問題も解決することができました。