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

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

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

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

Q&A

4回答

525閲覧

Pythonでのテキストファイルの読み込み

akakt

総合スコア4

Python

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

1グッド

1クリップ

投稿2020/03/27 02:42

Pythonでテキストファイルを行ごとに読み込み,
読み込んだ値を係数として計算を行っていきたいです.
例として次のようなテキストファイルを読み込むとして,
10
25
15
読み込んだのちに1行目をCurrent,2行目をVoltage,3行目をSpeed
といった文字列に割り当てたいです.
具体的に言うと
Current = 10
Voltage = 25
Speed = 15
となるようにしたいです.
その後,例えば
print(Current + Voltage)
とした際に
35
と表示されるようにしたいです.

また,読み込むファイルにコメントをつけたいです.
例として
10  !電流
25 !電圧
15 !速度
といったテキストファイルを上記のように読み込めるようにしたいです.

現在のコードは
with open('input.txt') as f:
data = [int(line) for line in f]

Current = data[0]
Voltage = data[1]
Speed = data[2]

print(Current + Voltage)

となっていて,一行ごとに文字を割り当てなおしています.
ですので,この文字の割り当てを楽にしたいと考えています.
また,この方法ですとテキストファイルにコメントを入力するとエラーが出ます.
ですのでコメントを入れてもエラーが出ない方法があればと思います.

DrqYuto👍を押しています

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

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

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

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

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

guest

回答4

0

コメントを一文字以上のスペースを開けて書くとすると,

py:

1with open(input.txt') as f: 2 txt = f.read() 3current, voltage, speed = map(lambda s: int(s.split(" ")[0]), filter(lambda s: s != "", txt.split("\n")))

でできると思います.
ただし,このようなやり方でなく,yamlやjson形式の設定ファイルを使うことをおすすめします.

投稿2020/03/27 03:00

dark-eater-kei

総合スコア1248

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

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

0

数字とコメントを何で区切るか、を決めておいて(スペース?ビックリマーク?)、
1行読んだら、その区切り文字で文字列を分割し、最初の文字列を整数変換すればいいです

投稿2020/03/27 02:50

編集2020/03/27 02:50
y_waiwai

総合スコア88042

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

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

akakt

2020/03/27 02:54

回答ありがとうございます. プログラミング初心者のため, 文字分割の方法や整数変換についてあまりよく知らないので 教えていただけないでしょうか.
y_waiwai

2020/03/27 02:59

「python 文字列分割」でぐぐるとそのやり方の記事が出てきます また、「python 文字列変換」でぐぐると、整数に変換する記事がたくさん出てきます まずはこれらの記事を読んで、その上でわからないことが出てきたら、その記事とともに質問していただければ回答できるかと思います
guest

0

※ Pythonの慣習に沿って変数は小文字に変更してます。

標準入力から受け取る場合

python

1current, voltage, speed = [int(input().split("!")[0]) for _ in range(3)]
  • python program.py < data.txt

標準入力と引数ファイル名に対応

python

1# 但し、データファイルに余分な行が含まれていると ValueError 2import fileinput 3 4current, voltage, speed = [ 5 int(line.split("!")[0]) for line in fileinput.input() 6]
  • python program.py < data.txt
  • python program.py data.txt

標準入力から受け取れるようにしておくと、
テストデータの為に、別ファイルを準備が必要なんて手間を省けます。


テキストからデータを読み込むのは、
「競技プログラミング」では定形の処理なので、
探せばサンプルコードは多く見つかりますが、

Python2.x/3.x の違いについて注意点

# Python2.7 で、input()を使って標準入力から読み込む場合 # データ中のコメント区切りを '#' にすれば # Pythonのコメントと解釈されるので、このコードでも目的の数値を得られますが # 任意のコードを実行できてしまう為、安全ではないので注意。 current, voltage, speed = [input() for _ in range(3)]] # 2.x) current, voltage, speed = map(input, range(3)) # 3.x) current, voltage, speed = [eval(input()) for _ in range(3)]]

このようなコードはサンドボックス環境で実行することが前提で、
セキュリティリスクが考慮されてないことがあります。
実際にコードを参考にする場合は注意です。

以下のような形にしておくと、デバッグやテスト時に便利です。

def func(current=0, voltage=0, speed=0): print(current + speed) def main(): import fileinput params = ["current", "voltage", "speed"] # リストで読み込み # args = [int(v.split("!")[0]) # for _,v in zip(params, fileinput.input())] # 辞書で読み込み kw = dict((k,int(v.split("!")[0])) for k,v in zip(params, fileinput.input())) # func(*args) func(**kw) if __name__ == "__main__": main()

実行方法4通りに対応

# 第一引数に渡す $ python program.py data.txt 35 # 標準入力を通じてファイルから読み込み $ python program.py < data.txt 35 # 標準入力から読み込み(スクリプト実行後に自分で入力) $ python program.py 10 25 15 ^Z <-- EOF を打ち込む (win: Ctrl-Z, linux: Ctrl-D 等) 35 # 対話入力を使ってテスト $ python -i program.py >>> func(10, 25, 15) 35

投稿2020/03/27 08:41

編集2020/03/27 09:22
teamikl

総合スコア8760

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

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

0

Python

1import re 2 3with open('data.txt') as f: 4 Current, Voltage, Speed = [int(re.sub('[^0-9].*', '', s)) for s in f] 5 6print(Current + Voltage);

ファイルの行数が 3行より多い場合は、
Current, Voltage, Speed = [int(re.sub('[^0-9].*', '', s)) for s in f][:3]
として、先頭の 3行だけを使うようにしてください。

問題が解決したら逃げ出すのではなく、回答にコメントを書いてください。

投稿2020/03/27 07:32

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問