わからないこと
Pythonでファイルの先頭にデータを書き込む方法。
### 調べてよくよく考えたら無理だったこと
python
1with open(filepath, "r+" ...) as csvFile: 2 ...
上記のように、「r+」で先頭に書き込もうと思ったのですが、これをよく調べてみると上書きになるようです。
実現したいこと
ファイルがなかったら新規作成する。
ファイルがあったらファイルの先頭にデータを着込む。(追記モードで)
ファイルがなくても、新規作成して先頭にデータを書きこむ。
いろいろなプログラム向けのサイトだったりを回ってきたのですがまだ解決に至っていません。
どうすれば実現できるのか。
実現するにはどんな手段があるのかなどを教えていただきたいです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
ファイルの先頭にデータを追加するということはできません。
なので、別ファイルを開き、追加データを書き込んだ後に元ファイルのデータを追加していきましょう。
そして、書き込みが終わったら、元ファイルを削除し、別ファイルの名前をリネームさせます
なんだったら、元ファイルはバックアップファイルとしてリネームするってのでもいいでしょうね
投稿2019/07/23 02:30
編集2019/07/23 02:31総合スコア88163
0
ベストアンサー
既に他の方々からの回答で、直接、ファイルの先頭にデータを追加するのは無理とあります。具体的な方法として、既に回答のある以下の2つになると思います。
- 新規ファイルに追加データを書込み、元ファイルのデータを追記、その後、旧ファイルの削除と新規ファイルのリネーム。
- 元ファイルのデータを全て読込み、追加データを先頭から、上書きし、元データを追記する。
Python と言うより、一般的な話になりますが、それぞれにメリット、デメリットがあります。
新規ファイルを作成する場合のメリットとして、
- 元ファイルのデータは、(書込み失敗でも)削除するまで残る。
- 読み書きファイルが分離しているので分かり易い。
デメリットとして、
- ハードリンクされている場合、リンクが切れ、別ファイルとなる。
- 一瞬であるが、ファイルが存在しない時がある。
- 別アプリ等がオープンしていると、削除/リネームが失敗し、複数ファイルが残る。(更新は書込みそのものが失敗)
- ファイルの属性が書き換えられる。(一手間掛けないと元ファイルと同じにならない)
となり、元ファイルを書き換える場合は、その逆となります。
どちらが良いかは、使う目的等によりますが、自分としては、元ファイルの更新が良いと考えます。(何度か、落とし穴にはまってるので)
具体的方法については、hayataka2049さんの回答を参考にすれば、良いでしょう。
なお、なんで先頭に追加できないかは、磁気テープの名残りと言うより、記憶装置が 4Kとか、8K とかのブロックで書き換えるからでしょう。ファイルシステムで吸収という方法もあるでしょうが、数バイトずらすのは大変と思います。
[追記]
新規ファイルの場合のデメリットを追加しました。
大半は、Linux(Unix)での問題となります。(質問者の環境はなんでしょう?)
投稿2019/07/23 12:40
編集2019/07/24 14:08総合スコア6385
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こういう感じでいいんじゃないでしょうか。
python
1with open("target.txt", "r+") as f: 2 original_data = f.read() 3 f.seek(0) 4 f.write("書きたいもの") 5 f.write(original_data)
もう少し素直なアプローチ。
python
1with open("target.txt", "r") as f: 2 original_data = f.read() 3 4with open("target.txt", "w") as f: 5 f.write("書きたいもの") 6 f.write(original_data)
この方法は全データをメモリ上に読み込みます。
投稿2019/07/23 08:01
編集2019/07/23 08:03総合スコア30939
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ファイルのポインターを変えればいいのではないでしょうか。
python
1with open(filepath, "r+" ...) as csvFile: 2 target = list(csvFile.read()) 3 target.insert(0, "入れたい文字列") 4 csvFile.seek(0) 5 csvFile.write("".join(target)) 6
で先頭に書き込めますよ。
投稿2019/07/23 04:59
編集2019/07/23 12:13
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。