質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2766閲覧

指定行の上書き・変更について

norisu

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

2クリップ

投稿2020/04/21 15:49

editbox1とeditbox2からtxtファイルへ出力された文字を、行指定しながら上書きしたいのですが、
行指定が上手くいきません。追記でなく、文字列の変更をしたいとなるとどのような方法があるでしょうか??

python

1import os, tkinter, tkinter.filedialog, tkinter.messagebox 2import tkinter as tk 3import sys 4import cv2 5from PIL import Image,ImageTk 6import numpy as np 7 8def func(): 9 global value 10 print("in the function =",EditBox1.get()) 11 value = EditBox1.get() 12 with open(r'save.txt',"w") as f: 13 print("in the function1 =",EditBox1.get(),"\r\n", file=f) 14 15def func2(): 16 global value2 17 print("in the function2 =",EditBox2.get()) 18 value2 = EditBox2.get() 19 with open(r'save.txt',"w") as f: 20 print("in the function2 =",EditBox2.get(), file=f) 21 22# ウインドウ 23root = tkinter.Tk() 24root.title(u"テストプログラム") 25root.geometry("480x320") 26root.resizable(width=False, height=False) 27 28 29# データ数入力 30Static1 = tkinter.Label(text=u'データ数') 31Static1.place(x=5,y=5) 32EditBox1 = tkinter.Entry(width=5) 33EditBox1.place(x=100, y=5) 34b = tkinter.Button(text='Exec', command=func) 35b.place(x=150, y=5) 36 37 38Static2 = tkinter.Label(text=u'データ数') 39Static2.place(x=200,y=5) 40EditBox2 = tkinter.Entry(width=5) 41EditBox2.place(x=300, y=5) 42c = tkinter.Button(text='Exec', command=func2) 43c.place(x=350, y=5) 44 45 46root.mainloop() 47
DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

txtファイルへ出力された文字を、行指定しながら上書きしたいのですが、

行指向のテキストファイルの場合 (シーケンシャル・アクセス)

  • 一時的に別ファイルに全内容を書き出します。(追記)
  • 指定行までを数えながら毎行読み込んで、読み飛ばし 書き出し
  • 該当行を書き込む
  • 残りの行を書き込む
  • 最後にファイルをリネーム

という過程が必要になり、
ファイルが大きくなる程、無駄なファイルの入出力も大きくなります。

また、読み書きの時間が長くなるとファイル破損のリスクが大きくなるので、
実際に運用する場合は、(データの重要度次第で)ロックファイルを用いた排他制御等々が必要になってきます。


追記でなく、文字列の変更をしたいとなるとどのような方法があるでしょうか??

データが固定長のバイナリファイルであれば、(ランダム・アクセス)
例えば、レコードの最大値を決めておくと、読み出し位置が計算で求まるので

  • 指定レコード迄をseek()で読み飛ばし
  • 該当のレコードを上書き

のみで済みます。(テキストエディタで開けなくなる等のデメリットは有ります)

データが固定長の数値のみの場合は、ファイルサイズを少なく収められる利点有。
但し、コメント等の何文字入力されるかわからない可変長のテキストを含む場合には向いてません。


他の簡易な方法として、書き出すデータが少量なら、readlines()で全ての行を読込んで、
該当行を変更した後にファイル全体を書き出し等でも良いですが、メモリにデータを読み込む為、
データが大きくなると当然占有メモリも大きくなります。

データの規模が大きくなる場合は、sqlite3 等のデータベースの利用がお勧めです。

投稿2020/04/21 22:59

編集2020/04/22 00:34
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問