🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

1432閲覧

Python CSVファイルのデータ更新チェック

raspypy

総合スコア247

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/11/25 05:24

編集2019/11/25 06:58

##やろうとしていること

CSVファイルにデータが追加されたことを判定したい。
データが更新されない限り、LEDの点滅を続けるプログラムを作成したい。

csvファイルの更新は別プログラムで1分おきに行います。
⇒この別プログラム内で、更新の判定を行うことはしません。

##判定の考え方
csvファイルは、100個のデータが保存されています。
①最初にcsvファイルを作成すると、最下行(100行目)にデータが記録されます。
※1~99行目までは、0が入力されるようにしています。
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
(省略)
2019, 11, 25, 11, 11, 26.5,

②データが0の個数を数えて、前後の個数を比較することで、判定しようと考えています。

##今のプログラム
0の個数をカウントし、1つ前の個数をprev_y_sum
現在の個数をy_sumとして、
同じ個数であれば、データは更新されていないと判定し、LEDを点滅
という考えで作成しています。

python

1def setup_led(): 2 GPIO.setmode(GPIO.BCM) 3 GPIO.setup(19, GPIO.OUT) 4 GPIO.output(19, GPIO.LOW) 5 6def read_temp(): 7 global prev_y_sum 8 prev_y_sum = y_bool.sum() 9 10 11def LED(): 12 print (y_sum) 13 print (prev_y_sum) 14 15if __name__ == '__main__': 16 try: 17 setup_led() 18 read_temp() 19 LED() 20 except KeyboardInterrupt: 21 pass 22 GPIO.cleanup()

##困っていること
↑のプログラムを実行すると、
次のエラーが発生してしまいます。
prev_y_sumをどのように設定すれば良いのかが分からず困っています。

test

1 if prev_y_sum == y_sum: 2UnboundLocalError: local variable 'prev_y_sum' referenced before assignment

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

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

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

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

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

guest

回答2

0

自己解決

条件判定分の中でファイルを常に読むことで、解決できました。

投稿2019/11/25 06:59

raspypy

総合スコア247

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

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

0

「prev_y_sumがまだ定義されていないうちに比較している」ことが原因です。
全体のソースがどうなっているのかわからないのですが、read_temp()がコールされる前にLED()が呼ばれていたりしませんか?

このエラーを出なくするには以下のようにすればいいと思いますが、全体的にコードの見直しを行った方がいいかもしれません。

python

1def LED(): 2 prev_y_sum = 0 3 while True: 4 y_bool = df_c['year'] == 0 5 y_sum = y_bool.sum() 6 if y_sum == prev_y_sum: 7 GPIO.output(19, GPIO.HIGH) 8 sleep(1.0) 9 GPIO.output(19, GPIO.LOW) 10 sleep(1.0) 11 else: 12 break 13 prev_y_sum = y_bool.sum() 14 print (prev_y_sum)

投稿2019/11/25 05:41

Yamato.dd

総合スコア48

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

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

raspypy

2019/11/25 06:17 編集

回答ありがとうございます。プログラムを更新させていただきました。 prev_y_sum = 0とすることで、エラーは発生しなくなりましたが、意図する結果となりませんでした。 [意図する結果] prev_y_sum とy_sumの値が同じであれば、LEDの点滅が続く(無限ループ) prev_y_sum とy_sumの値が同じでなければ、無限ループから抜ける [実際の結果] 42 (y_sum) 42(prev_y_sum) と表示されただけで、LEDの点滅はなし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問