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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

2704閲覧

外部ファイルの読み書き

sumao

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/02/14 09:07

テキストファイルに数字を書き込み(input)、それをoutputする作業を繰り返し行いたいのですが、inputの変数を変えてもoutputが変化しません。

具体的なコードは以下の通りです。

import linecache for number in range(1,10): f = open("sum_col_data.txt","w") f.write("") f.close() sum_col = str(number) print("input=" + sum_col) f = open("sum_col_data.txt","a") f.write(str(sum_col) + "\n") f.close() read_row = linecache.getline("sum_col_data.txt",1) read_row_original = read_row.rstrip("\n") print("output=" + read_row_original) print("No." + sum_col + " is finished")

inputは1,2,3..と変わり、outputも1,2,3..と変わっていくはずですが、ずっと1のままです。outputも1,2,3..と変えていくためにはどう修正すればよいのでしょうか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

python

1# -*- encoding: utf-8 -*- 2 3for number in range(1, 10): 4 5 sum_col = str(number) 6 print("input=" + sum_col) 7 8 with open("sum_col_data.txt", "w") as f: 9 f.write(sum_col + "\n") 10 11 with open("sum_col_data.txt", "r") as f: 12 print("output=" + f.readline().rstrip("\n")) 13 14 print("No." + sum_col + " is finished")

毎回"w"でリセットするのにそのあとに"a"で追記ってのがよく分からないですね。
ただそのプログラムを書いた意図を察すると、上記のようになります。

投稿2017/02/14 11:03

編集2017/02/14 11:34
kiritsugu

総合スコア127

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

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

sumao

2017/02/14 11:05

ありがとうございます!今後参考にします!
guest

0

ベストアンサー

linecache.getline() は、すでにキャッシュされている場合にその値を返すので、ファイルを更新しても最初に取得した値(output=1)を返し続けます。

今回のように元のファイルが変更される場合は、linecache.checkcache() でチェックすれば、ファイルの更新を検出しキャッシュがクリアされるはずなのですが、環境や使い方によってはうまく動きません。

日時を秒単位でしか扱えないOS・ファイルシステム上で、上記サンプルコードのように短時間にファイルの読み書きを激しく行うと、

  • ファイル名:"sum_col_data.txt" 更新日時:"2017-02-14 19:30:00"
  • ファイル名:"sum_col_data.txt" 更新日時:"2017-02-14 19:30:00"
  • ファイル名:"sum_col_data.txt" 更新日時:"2017-02-14 19:30:00"
  • ・・・

とまるでファイルが更新されていないように見えてしまい、結果キャッシュの更新が行われません。

linecache.clearcache() を実行し、その都度キャッシュをクリアすれば意図した動作をしますが、それではキャッシュの意味がまるでありません。

そもそも linecache は変更されない大きなテキストファイルの一部を取り出すためのモジュールです。やりたい事に対して linecache を使うのが適切がどうか、まず検討してみると良いと思います。

投稿2017/02/14 10:40

miyahan

総合スコア3095

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

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

sumao

2017/02/14 11:01

ご丁寧にありがとうございました!!できました!
guest

0

このような処理をするにあたり、なぜlinecacheを利用しているのかよくわかりません。
このlinecacheにより、前回読み込んだ情報がキャッシュされ、何度読み出しても、
期待する情報が得られないです。

最後の行に、以下を追加することで期待の動作をすると思います、あまり意味がないコードになりますが、参考までに。

python3

1
linecache.clearcache()

投稿2017/02/14 10:39

t_obara

総合スコア5488

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

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

sumao

2017/02/14 11:04

ありがとうございます。ご指摘通りです。実際はもっと大きく複雑な処理をするコードですが、ウェブ上でそれは公開できないので、抽出した部分だけを掲載しました。そのため意味不明なコードになっていたと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問