質問するログイン新規登録
Python

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

Q&A

解決済

3回答

493閲覧

[数値 数値 数値]のファイルの数値を一次元リストに格納したい

yyicp

総合スコア88

Python

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

1グッド

2クリップ

投稿2025/09/02 02:33

編集2025/09/02 02:40

1

2

実現したいこと

sample1.txtは次のようなファイルです。
[-0.5 -0.3 -0.2]

このファイルを読み込んで、
s1[0]=-0.5, s1[1]=-0.3, s1[2]=-0.2
となるようにしたいです。

「該当のソースコード」の3行目のように読み込んではうまくいきませんでした。どなたか直してください。(floatではなく、stringと認識している気がしています)

該当のソースコード

python

1import pandas as pd 2 3s1 = pd.read_csv('sample1.txt', header=None) 4print(s1) 5# 0 6#0 [-0.5 -0.3 -0.2] 7print('') 8print(s1[0]) 9#0 [-0.5 -0.3 -0.2] 10#Name: 0, dtype: object 11print('') 12print(s1[0][0]) 13#[-0.5 -0.3 -0.2] 14print(s1[0][0][0])#[ 15print(s1[0][0][1])#- 16print(s1[0][0][2])#0 17print(s1[0][0][3])#. 18print(s1[0][0][4])#5

試したこと

「該当のソースコード」で色々出力してみました。
5行目の0の意味がよく分かりませんでした。
13行目の[-0.5 -0.3 -0.2]の0番目の要素が-0.5と期待したのですが、出力してみると一文字ずつ格納されていることが分かりました。

melian👍を押しています

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

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

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

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

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

TakaiY

2025/09/02 04:22

> sample1.txtは次のようなファイルです。 > [-0.5 -0.3 -0.2] 以前の回答でこれらのデータは仕事で処理しているとのことでしたが、これは、この文字列が入っているファイルを何かのツールが吐き出すということなのですか?(カンマで区切られていないのでpythonで出しているということではなっそうではありますが) しかも、ファイルにこれが1行だけですか?
yyicp

2025/09/02 05:01

>TakaiY様 コメントありがとうございます。 はい、別のpythonプログラムで吐き出しています。 二次元リストをnp.ravelで一次元にしたものです。 行数は一行です。(要素数はもっと多いです) 自分が分かりやすいように(何をやっているかがわかるように)少しずつ作っています。 最後に処理をまとめられるところはまとめる、省略できるところは省略すると思いますが、 現時点ではとりあえず最初から愚直に作る方針でやっています。
YellowGreen

2025/09/02 11:04 編集

既に解決済みとは思いますが… pandas の read_csvを生かして… s1 = pd.read_csv("sample1.txt", header=None).iloc[0][0][1:-1].split(" ") 数値として取り出したいなら s1 = list(map(float, pd.read_csv("test.txt", header=None).iloc[0][0][1:-1].split(" "))) 冒頭と最後の[]がなく、数値のみが空白区切りで格納されているなら s1 = pd.read_csv("sample1.txt", header=None, sep=" ").iloc[0].values.tolist()
melian

2025/09/02 10:48 編集

> YellowGreen さん その場合、各要素は文字列(str)になります。 print(s1) # ['-0.5', '-0.3', '-0.2'] なので、以下の様にするとよいかと思います。 s1 = pd.read_csv("sample1.txt", header=None).iloc[0, 0][1:-1].split(" ") s1 = [*map(float, s1)] print(s1) # [-0.5, -0.3, -0.2]
YellowGreen

2025/09/02 10:53

melian 様 ご指摘ありがとうございます 入れ違いで追記修正していたところでした
bsdfan

2025/09/02 10:54

途中処理をファイルに出して確認しながら進めるのはよくある方法かと思いますが、読み込むときのことを考えて、読み取りやすいような形で出力することを考えた方がいいですよ。
yyicp

2025/09/03 00:56

>YellowGreen様、melian様 できました。 どうもありがとうございました。 >YellowGreen様 回答欄にも記入をお願いします。
yyicp

2025/09/03 01:01

>bsdfan様 コメントありがとうございました。
guest

回答3

0

既に解決済みですが,御参考としてstr.strip() メソッドを用いた記述例を示します。

Python

1with open('sample1.txt', 'r') as f: 2 s1 = f.readline().strip('[]\n').split() 3 4# print(s1) 5s1 = [float(s) for s in s1] 6print(s1) 7# [-0.5, -0.3, -0.2]

投稿2025/09/02 09:15

little_street

総合スコア507

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

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

yyicp

2025/09/03 00:47

できました。 どうもありがとうございました。
guest

0

すみません。 回答ではありません。

コメントで

これは、この文字列が入っているファイルを何かのツールが吐き出すということなのですか?

という質問に

はい、別のpythonプログラムで吐き出しています。
二次元リストをnp.ravelで一次元にしたものです。

と回答いただきました。
これまでのいくつかの質問も含めて判断すると、何らかのデータの処理をするにあたって、データ(ファイル)を読んでは処理をしてファイルに書き出し、それをさらに読んで処理して書き出し、というのと何度もくりかれして成し遂げようとしているように思います。

この方式は、愚直ではありますが悪手だと思います。
途中結果がファイルとしていちいち確認できるというのは、プログラミングに慣れない方には安心できるのかもしれませんが、データには型(intとかstringとか)があり、構造を持たせることで適切に効率よく処理することができます。しかし、途中でテキストファイルにしてしまうと元の型や構造は失われてしまい、再構築することになってしまいます。
処理の流れについても、複数のファイルに分散していると理解するのが難しくなります。

また、特に今回の質問で感じたのは、この質問が質問者さんが目的としているデータ処理の課題解決に何の関係も無いことです。 pythonプログラムにあったデータをテキストに落し、それを改めて読むということですから。


どのような課題に取り組んでいるのかわかりませんが、基本的に1つの pythonファイルで処理するように設計しなおすのがいいだろうと思います。

  1. 元のデータファイルを読み込む
    読んだデータは処理しやすい形式で保持する。
    必要なデータが複数種類あれば、複数読み込み、複数のデータを作る。
  2. 読み込んだデータに必要な処理をする
    必要な処理はすべて行なう。
  3. 結果として必要なデータを出力する。
    複数の結果が必要であれば、処理を繰替えし出力する。

内部でどのようにデータを持つかについては、どのような処理をしたいのかでいろいろな選択肢があるので、よくわからないのであれば、ここのような質問サイトで聞いてみるといいでしょう。処理の内容によっては途中結果として中間データを作るのもよくやることです。

処理については、それこそ愚直に少しずつやればいいのですが、そのたびにファイルに書き出して読み直すということをするのでなく、そのデータのまま次の処理をすればいいのです。
作っている途中で内容を見るためにファイルに書いてみるのはいいと思いますが、それはあくまで一時的にです。

投稿2025/09/02 06:15

TakaiY

総合スコア14610

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

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

yyicp

2025/09/02 07:27 編集

コメントありがとうございました。 コメントの方にも書きましたが、最後にプログラムを整理して不要な部分は省略するつもりです。 私は、完成するまでは途中経過をいちいち書き出して確認したいです。 プログラムの行数が増えていくので、「ここまでは合っている」という確信を得てから次に進みたいです。 プログラムの高速化は、正しいプログラムができた後に考えれば良いかなと思っています。歩みは少しずつにした方が良いと思っています。 考え方が合わず申し訳ありません。
TakaiY

2025/09/02 07:56

> 私は、完成するまでは途中経過をいちいち書き出して確認したいです はい。それは問題無いと思っています。回答にも書いています。 > プログラムの行数が増えていくので、「ここまでは合っている」という確信を得てから次に進みたい これも良い姿勢だと思います。 ですが、確認のために書き出したものを読み込む必要はないと考えます。書き出す前のものを使えばいいのですから。
yyicp

2025/09/03 01:10

こちらの事情をざっくり言うと、 今、コード1、コード2という2つのコードがあって、 本来は1+2というコードを作りたいところ、 それではプログラムの行数が長くなるので、 1で出力されたファイルを2で読み込んで使いたいという事情でした。
guest

0

ベストアンサー

ast.literal_eval() で Python のリストを表現する文字列をリストインスタンスに変換します。

python

1import re 2from ast import literal_eval 3 4with open('sample1.txt') as f: 5 s1 = literal_eval(re.sub(r'[ \t]+', ',', f.readline())) 6 7print(s1) 8print(type(s1[0])) 9 10# [-0.5, -0.3, -0.2] 11# <class 'float'>

追記

以下、Pandas を利用する場合です。

python

1import pandas as pd 2 3s1 = pd.read_csv('sample1.txt', header=None, sep=r'[][ \t]+', engine='python').iloc[0,1:-1].to_list() 4 5print(s1) 6# [-0.5, -0.3, -0.2]

投稿2025/09/02 03:01

編集2025/09/02 11:10
melian

総合スコア21449

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

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

yyicp

2025/09/02 03:13

ご回答ありがとうございます。 ご提示のコードを出力してみると、s1[0][0]に-0.5、s1[0][1]に-0.3、s1[0][2]に-0.2が入っています。 >なお、sample1.txt の内容が複数行の場合を考慮して s1 をリストにしています。 の意味はこういうことでしょうか。 説明不足で申し訳ないですが、sample1.txtの中身は一行です。なので、s1[0]=-0.5, s1[1]=-0.3, s1[2]=-0.2となるように直していただけるとありがたいです。
melian

2025/09/02 03:19

中身が一行の前提でコードを修正しました。
yyicp

2025/09/02 04:02

できました。 どうもありがとうございました。
yyicp

2025/09/03 01:00

追記のコードもどうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問