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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

Q&A

解決済

2回答

715閲覧

Python3における外部ファイルへのアクセス方法

makoi

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

0グッド

0クリップ

投稿2021/06/26 05:57

編集2021/06/26 11:40

電光掲示板を作り、記載される文字を自由に変えたいです。

Python3でLEDマトリクスパネルの制御を行っています。

LEDマトリクスパネルに文字列を走らせているのですが、現時点では、Python3のコードに直接文字列を記入しないと反映されません。
今回は、コード内からLEDマトリクスパネルに投影する文字列を決めるのではなく、外部のテキストファイルを参照してLEDマトリクスパネルに文字列を反映したいと考えています。

外部ファイル(テキストファイル)から文字列のデータを入手する機能を実装するときにエラーメッセージが発生しました。

#!/usr/bin/env python # Display a runtext with double-buffering. # coding: utf-8 from samplebase import SampleBase from rgbmatrix import graphics import time class RunText (SampleBase): def __init__(self, *args, **kwargs): super(RunText, self).__init__(*args, **kwargs) self.parser.add_argument("-t", "--text", help="The text to scroll on the RGB LED panel", default = "open('data.txt','r')") def run(self): offscreen_canvas = self.matrix.CreateFrameCanvas() font = graphics.Font() font.LoadFont("../../../fonts/7x13.bdf") textColor = graphics.Color(255, 255, 255) pos = offscreen_canvas.width my_text = self.args.text while True: offscreen_canvas.Clear() len = graphics.DrawText(offscreen_canvas, font, pos, 20, textColor, my_text) pos -= 1 if (pos + len < 0): pos = offscreen_canvas.width time.sleep(0.05) offscreen_canvas = self.matrix.SwapOnVSync(offscreen_canvas) # Main function if __name__ == "__main__": run_text = RunText() if (not run_text.process()): run_text.print_open()

参考にしたコードからの変更点 コードの11行目

self.parser.add_argument("-t", "--text", help="The text to scroll on the RGB LED panel", default = "Hello World")

から、文字列を記入していたdefault = "Hello World")の部分を変更すればよいと考え,openを使いテキストファイルを取り出そうと思いコードを

self.parser.add_argument("-t", "--text", help="The text to scroll on the RGB LED panel", default = "open('data.txt','r')")

に変更しました。
しかし、LEDマトリクスパネルに表示されるのはテキストファイルの結果ではなくopen('data.txt','r')という文字列でした。

LEDマトリクスパネルに表示される文字列を外部ファイル(テキストファイル)から取り出すにはどの部分を改良するべきなのかアドバイスをいただきたく質問させていただきました。

よろしくお願いします。

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

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

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

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

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

y_waiwai

2021/06/26 06:06

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
jbpb0

2021/06/26 06:32

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
makoi

2021/06/26 11:42

アドバイスありがとうございます。 初めての質問で書き方が分からず読みにくいコードを載せてしまっていたので、とても参考になりました。 修正完了しました。
jbpb0

2021/06/26 22:59

ファイルからテキストを読む処理を追加しないといけないのでは? self.parser.add_argument("-t", "--textfile", help="The text to scroll on the RGB LED panel", default = "data.txt") と変えて(help=…は自分で書き直してください)、 my_text = self.args.text を with open(self.args.textfile) as f: my_text = f.readlines().split('\n')[0] と変える みたいな 動かして試してないので、うまく動かなければ、ごめんなさい
makoi

2021/06/27 05:23

回答ありがとうございます。 頂いたアドバイスを基にコードを書き換えてみたところいくつかエラーが出てしまいました。 File "runtext.2", line 36, in <module> if (not run_text.process()): File "/home/pi/rpi-rgb-led-matrix/bindings/python/samples/samplebase.py", line 71, in process self.run() File "runtext.2", line 20, in run my_text=f.readlines().split('¥n')[0] AttributeError: 'list' object has no attribute 'split' というエラーが出たのですが、エラーの意味や解決手法のアドバイスをいただけませんか?
jbpb0

2021/06/27 10:20

失礼しました my_text = f.readlines().split('\n')[0] ではなく my_text = f.readlines()[0].rstrip('\n') で、いけるはず
makoi

2021/06/27 12:04

複数回の回答ありがとうございます。 おかげさまで解決しました。 もしよろしければ' f.readlines() の後に [0].rstrip('\n') を追加したのかを教えていただけませんか? rstrip()というのが指定した文字を消去するということは知っているのですが、この場で使用した目的が私にはわかりませんでした。 どうかよろしくお願いします
jbpb0

2021/06/27 12:51 編集

「.rstrip('\n')」を付けないと、外部のテキストファイルの作り方によっては、「my_text」に代入された文字列の最後に改行文字が付いてしまいます コードを使用する上でそれが大丈夫かどうかが分からなかったので、改行文字を削除した方が無難だと思い、「.rstrip('\n')」を付けました たとえば、内容が aaa だけのテキストファイル「test.txt」を作って、下記のコードを実行してみてください (my_text =... の行はインデントを入れてください) with open("test.txt") as f: my_text = f.readlines()[0] print(my_text) 上記を実行した結果ですが、「test.txt」の aaa の行の最後に改行が付いてる場合と、付いてない場合で、違いがあります 改行が付いてる場合は、「print(my_text)」の結果の aaa の次に空行が表示されます それは、「my_text」に改行文字が入っているためです 一方、改行が付いてない場合は、 aaa の次に空行が表示されません それは、「my_text」に改行文字が入ってないためです 簡単に確認できるので、ぜひ実際にやってみてください このように、テキストファイルの書き方によって「my_text」に改行文字が入ったり入らなかったりすると、それをLEDマトリクスパネルに表示させた際に、もしかすると表示のされ方に違いが表れるかもしれないと思い、「my_text」の最後に改行文字が入らないようにしました 「my_text」の最後に改行文字があってもなくても、使用上問題ないなら、もちろん「.rstrip('\n')」はなくて構いません
makoi

2021/06/28 05:56

回答ありがとうございます。 とても分かりやすく説明してくださったおかげで理解することができました。 最後までご付き合いしていただきありがとうございました。
makoi

2021/06/29 06:04

先日は回答ありがとうございました。 提示していた問題については解決したのですが、後日テキストファイルを書き換えてLEDマトリクスパネルの点灯パターンを変化させ遊んでいたのですが、そこで重大な欠陥に気づきました。 それは、テキストファイルの内容を変えてもRaspberry piで実行されているLEDマトリクスパネルを駆動させる下記のプログラムを終了し、再度実行しないとLEDマトリクスパネルの表示が変わらないことです。 私が考え、初期設定として__init__の部分で、data.txtファイルを指定しているため、初めに指定された文字列がプログラム終了まで常にLEDマトリクスパネル上を流れているのだと思いました。 だから、 def __init__(self, *args, **kwargs): super(RunText, self).__init__(*args, **kwargs) parser = argparse.ArgumentParser() self.parser.add_argument("-t","--textfile",default ="data.txt") の中身の super(RunText, self).__init__(*args, **kwargs) parser = argparse.ArgumentParser() self.parser.add_argument("-t","--textfile",default ="data.txt") を次のdef run(self):に入れてやれば問題ないと思ったのですが、結果なにも変わらずに苦戦しております。 アドバイスをいただけないでしょうか?
makoi

2021/06/29 06:10

追加してベストアンサーにしたいんですけど一度、解答の場所にコメントを残してくれませんか?
jbpb0

2021/07/06 05:32

> プログラムを終了し、再度実行しないとLEDマトリクスパネルの表示が変わらない with open(self.args.textfile) as f: my_text = f.readlines()[0].rstrip('\n') を、現状の位置 (while True: の直前) から、while True: のすぐ下 (インデントは offscreen_canvas.Clear() に合わせる) に移したら、ファイルを修正したらすぐに反映されると思いますよ (動かして試してないけど)
makoi

2021/07/06 06:44

ご丁寧にありがとうございます。 現在提示していた課題をすべて解決しました。しかし、作業を次の段階に進めるうえで問題が生じたため質問させていただきたく思います。もしもマナー違反なら教えていただけると幸いです。 現在、LEDマトリクスパネルに任意の文字を入力することができるようになったので、次にその文字の色を自由に変えたいと思い、 textColor = graphics.Color.(0,255,255) の(0.255.255)の部分を任意に変更したい考えています。 方法として、任意の文字を走らせれるようにしたように外部ファイルから数字をいじれたらなと考え、 def__init__の文末を変更 self.parser.add_argument("-t","--textfile",default ="data.txt") self.parser.add_argument("-t","--textfile",default ="Color.txt") <--追加内容 ほかにも def run(self):に書かれていた textColor = graphics.Color(0, 255, 255) を変更して with open(graphics.Color.textfile)as c: textColor=c.readlines()[0].rstrip('\n')   に変え、同様に while True:文のif内に if (pos + len < 0): pos = offscreen_canvas.width with open(graphics.Color.textfile)as c: <--追加   textColor=c.readlines()[0].rstrip('\n') <--追加 with open(self.args.textfile)as f: my_text=f.readlines()[0].rstrip('\n') 二行追加しました。 見られるエラーとして argparse.ArgumentError: argument -t/--textfile: conflicting option strings: -t, --textfile があり、"-t"."--textfile"というのを複数(文字列と色の変更)に使おうとしているのが問題となっているみたいです。 今後私が取るべき解決手法などについてアドバイスをいただけないでしょうか?
makoi

2021/07/08 03:21

解決しました。 この度はありがとうございました。
jbpb0

2021/07/08 04:49

当初の質問内容から逸脱する内容を次々に追加するのは、よくないです 別の質問にしてください
guest

回答2

0

ベストアンサー

ファイルからテキストを読む処理を追加する必要があります
以下は、ファイルの1行目のテキストだけ読む場合のコードの例です

python

1 self.parser.add_argument("-t", "--text", help="The text to scroll on the RGB LED panel", default = "open('data.txt','r')")

↓ 変更 (help=...は自分で書き直してください)

python

1 self.parser.add_argument("-t", "--textfile", help="The text to scroll on the RGB LED panel", default = "data.txt")

 .

python

1 my_text = self.args.text

↓ 変更 (ファイルの1行目の行末に改行があってもなくても変わらないように、改行文字を削除してます)

python

1 with open(self.args.textfile) as f: 2 my_text = f.readlines()[0].rstrip('\n')

投稿2021/07/02 09:54

jbpb0

総合スコア7653

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

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

makoi

2021/07/06 04:50

ありがとうございました。
guest

0

default = open"('data.txt','r')" の部分が変です。

default = "open('data.txt','r')"

とかでしょうか。

投稿2021/06/26 07:16

ppaul

総合スコア24670

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

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

makoi

2021/06/26 07:29

default = "open('data.txt','r')"にしてしまうと、次の行の def run(self): の文においてinvalidn syntax のエラーが出てしまいます。 また、このエラーを消すために default ="open('data.txt','r')")という分に書き換えたのですが、このように書き換えると、外部のテキストがいるを反映せず、LEDマトリクスパネルに'data.txt','r'という文字列が出力されてしまいます。 どのように治せば、テキストファイルの文字列を出力できるかご助言よろしくお願いいたします。
ppaul

2021/06/26 09:53

修正すると次の文で文法エラーが出るというのは、二つの文法エラーがあって、文法エラーが見つかった時点でエラーを出して終了しているということです。2番目の文法エラーも修正しなければ先に進めません。 self.parser.add_argument("-t", "--text", help="The text to scroll on the RGB LED panel", default = "open('data.txt','r')") になっていますか。 次の行のdef run(self): の文においてinvalidn syntax のエラーが出る場合、多くのケースで最後の括弧が抜けているなどの書き間違いが多いです。
makoi

2021/06/26 11:37

回答ありがとうございました。 invalidn syntaxがでる多くのケースで最後の括弧が抜けているとありますがこれは default = "open('data.txt','r')"の状態で括弧が足りておらずエラーが出ているということなのか、それともdef run(self):の文の後において括弧が足りていないという認識なのか教えていただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問