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

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

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

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python

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

Q&A

1回答

459閲覧

Pythonでindex_labelの振り直しをしたい

退会済みユーザー

退会済みユーザー

総合スコア0

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python

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

0グッド

0クリップ

投稿2022/11/03 13:29

編集2022/11/08 14:11

前提

Pythonでindex_labelの振り直しをしたい

実現したいこと

  • それぞれのデータに対して新たにラベル番号を振り直したいです

apple1.json
apple2.json
banana1.json
banana2.json
banana3.json
orange1.json
...

これらのファイルの中にそれぞれ”index_label:〇”と番号が振られているのですが、
元のデータから一部をピックアップして使用したいため、このラベル番号の値を振り直したいです。

また、ラベル番号はapple1とapple2は同じ番号(index_label:1)、banana1とbanana2.とbanana3は(index_label:2)同じ番号というような仕様にしたいです。

ファイル自体の書き換えを行うコードは出てくるのですが、具体的にどのような命令を書けばいいかアドバイスをいただきたいです。
よろしくお願いいたします。

追記
返信欄のコードでは、ファイル名が直接代入されていました。
以下、ファイル名のリストを代入するコードに変更しましたが、同様のエラーが出ています。

Python

1import os 2 3with open('E:/VI/list.txt') as f: 4 file_readlines = f.readlines() 5 6str =file_readlines 7 8 9if str.startswith('apple'): 10 path = 'E:/VI' 11 f = open(path) 12 data_lines = data_lines.replace("label_index: 5", "label_index: 1") 13 14 f.close()

追記2

Python

1import os 2 3with open('E:/VI/list.txt') as f: 4 file_readlines = f.readlines() 5 6for json_file in file_readlines: 7 if json_file.startswith('apple'): 8 path = 'E:/VI' + json_file 9 f = open(path) 10 data_lines = data_lines.replace("label_index: 5", "label_index: 1") 11 f.close()

回答をもとに書き換えましたが、上記の認識で合っているでしょうか。
このコードで実行したところInvalid argumentとエラーが出てしまいました。(’E:/VI/apple001.json’)
しかし、ファイルを開いて確認したところ"label_index: 0"に書き換えられていました。

追記3

Python

1import os 2 3with open('E:/VI/list.txt') as f: 4 file_readlines = f.readlines() 5 6for json_file in file_readlines: 7 if json_file.startswith('apple'): 8 path = 'E:/VI' + json_file  9 with open(path) as reader: #Invalid argument 10 content = reader.read() 11 12 content = content.replace("label_index: 5", "label_index: 1") 13 14 with open(path) as writer: 15 writer.write(content)

回答をもとにf = openからのコードを変更してみました。
相変わらずpath部分にInvalid argumentエラーが出てしまいます。

追記4

Python

1import os 2 3with open('E:/VI/list.txt') as f: 4 file_readlines = f.readlines() 5 6for json_file in file_readlines: 7 if json_file.startswith('apple'): 8 path = 'E:/VI/' + json_file  9 with open(path, mode="w") as reader: #Invalid argument 10 content = reader.read() 11 12 content = content.replace("label_index: 5", "label_index: 1") 13 14 with open('1apple.json', mode="w") as writer: 15 writer.write(content)

新しくファイルを作成して書き込むようコードを変更してみました。
「E:/VI/」に変更してみたもののInvalid argumentのままでした。
試しに、

Python

1print(path)

を実行したところ、
E:/VI/apple-001.json

E:/VI/apple-002.json

E:/VI/apple-003.json

E:/VI/apple-004.json

E:/VI/apple-005.json

が出力されたため、ファイルは確かにあるのですが、上手くいきません。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/11/08 04:47

import os path = 'E:/VI' files = os.listdir(path) files_file = [f for f in files if os.path.isfile(os.path.join(path, f))] str = files_file if str.startswith('apple'): f = open(path) data_lines = data_lines.replace("label_index: 5", "label_index: 1") f.close() このようなコードを書いてみてひとまず書き換えができるか実行してみたのですが、 if str.startswith('apple'): にエラーが出ます。(AttributeError: 'list' object has no attribute 'startswith') strにはファイル名が代入されていることは確認しました。
TakaiY

2022/11/08 05:36

ここに書いてもインデントがわかりませんので、質問を編集して追記してください。
TakaiY

2022/11/08 05:38

strに代入されているのは、ファイル名ではなく、ファイル名のリストですよね?
退会済みユーザー

退会済みユーザー

2022/11/08 06:36

追加しました。
TakaiY

2022/11/08 07:09

確認ですが、str(= file_readlines) は「ファイル名のリスト」ですよね?
退会済みユーザー

退会済みユーザー

2022/11/08 07:11

はい、そうです。
TakaiY

2022/11/08 09:06

> 回答をもとに書き換えましたが、上記の認識で合っているでしょうか。 はい。合っています。 >ファイルを開いて確認したところ"label_index: 0"に書き換えられていました。 勘違いだと思います。 このコードでは内容を書き換えることはできません。
退会済みユーザー

退会済みユーザー

2022/11/08 11:44

書き換えの点、勘違いでした。失礼しました。
guest

回答1

0

どんなコードを書いているのかわからないので方式だけ。

  • ファイル名がapple1とapple2(以下列挙)ならindex_labelは1、banana1とbanana2.とbanana3(以下列挙)ならindex_labelは2に、(以下同様)というような情報を作ってファイル名からindex_labelの値を判断する。
  • ファイル名が 「apple」で始まっていればindex_labelは1、「banana」で始まっていればindex_labelは2、(以下同様)というような情報を作ってファイル名からindex_labelの値を判断する

のような感じでどうでしょう。


追記

そこでstartswithメソッドを使って、ファイル名の判別をしようと考えました

はい。

このメソッドは引数にリストを指定することができないようで詰まってしまいました。 先にファイルを読み込み、情報と一致するかを判別するというアプローチで考えればいいでしょうか。

ということはファイル名のリストは持っているのですよね? 開く時は1つずつファイルを扱っているはずですから、そのときのファイル名を startwith で判定して処理すればいいのではないでしょうか?
判定は読み込む前でも後でも特にかわりはないと思いますが。
ひっかかっているポイントがよくわかりません。


追記その2

strはモジュール名と被っているので使いません。

file_readlines にはファイル名のリストが入っていますので、それを1つずつ取り出して処理する必要があります。
リストの内容を1つずつ処理するには、 「for xxx in リスト」の構文を使います。 このループでは、リストの要素が1つずつxxxに入れられてループが回ります。

処理するファイル名のパスは、「E:/VI」を付けることでフルパスになるようですから、結合します。

なので、以下のようにすればいいでしょう。

python

1for json_file in file_readlines: 2 if json_file.startswith('apple'): 3 path = 'E:/VI/' + json_file 4 f = open(path) 5 data_lines = data_lines.replace("label_index: 5", "label_index: 1") 6 f.close()

追記その3

変更された質問のコードは意図の通りです。

ただし、現状の f = open() 以降の処理では、ファイルの内容は変更されません。
ファイルを変更するのであれば、

  • ファイルを開く
  • 内容を読み込む
  • 内容を編集する
  • 出力用のファイルを開く
  • 編集後の内容をファイルに書き出す
  • 必要であれば編集前のファイルを編集後のファイルで置き換える。

という処理をする必要があります。
また、ファイルを開いて処理をする場合、with open() を使ったほうがいいでしょう。


追記 その4

だいぶいい感じですね。
ただ、まだ、ファイルのパスがおかしいので、 Invalid argument になります。

path = 'E:/VI' + json_file 

これでは、ディレクトリ名とファイル名の間に区切りがないので、正しいパスになりません。
「path = 'E:/VI/' + json_file」こうしましょう。
書き込むときに以下のように書いていますが、これはだめです。

with open(path) as writer:

open関数は開くときのモードを指定することができ、何もしないと読み込みで開かれます。 これでは上書きできませんので、書き込みを指定する必要があります。ファイルを開くときはモードを意識するため、常にmodeオプションを指定するのがお勧めです。

python

1 with open(path, mode="w") as writer:

ファイルのパスの指定がまちがえていなければ、たぶんこれで動くでしょう。

ただ、ファイルの内容を変更してそのまま上書きしてしまうのは何か起きたときに元のファイルがなくなってしまうので、ちょっと怖いです。
変換後のファイルを入れるディレクトリを作ってそこに入れるなどするのがいいのではないかと思います。

python

1import os 2 3with open('E:/VI/list.txt') as f: 4 file_readlines = f.readlines() 5 6for json_file in file_readlines: 7 if json_file.startswith('apple'): 8 path = 'E:/VI' + json_file  9 with open(path) as reader: #Invalid argument 10 content = reader.read() 11 12 content = content.replace("label_index: 5", "label_index: 1") 13 14 with open(path) as writer: 15 writer.write(content)

投稿2022/11/03 13:50

編集2022/11/08 12:22
TakaiY

総合スコア12745

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

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

退会済みユーザー

退会済みユーザー

2022/11/06 06:54

ご回答ありがとうございます。 ファイル名が 「apple」で始まっていればindex_labelは1、「banana」で始まっていればindex_labelは2、(以下同様)というような情報を作ってファイル名からindex_labelの値を判断する の方式で実行しようと思いました。そこでstartswithメソッドを使って、ファイル名の判別をしようと考えましたが、このメソッドは引数にリストを指定することができないようで詰まってしまいました。 先にファイルを読み込み、情報と一致するかを判別するというアプローチで考えればいいでしょうか。
TakaiY

2022/11/06 07:06

回答に追記しました。
退会済みユーザー

退会済みユーザー

2022/11/08 04:48

ありがとうございます。質問に詳細追記しました。
TakaiY

2022/11/08 14:30 編集

readlines()は、行の末尾の改行コードも取り込んでしまいます。printしたときに余計に改行されてますよね。 改行込みでのファイル名を探してしまうのでみつからなくなります。 文字列のメソッドのstripで改行を取り除くことができます。以下のようにしてみてください。 path = 'E:/VI/' + json_file.strip() また、書き出すファイルを以下のようにしてはだめです。 with open('1apple.json', mode="w") as writer: これではすべてのファイルが同じ名前で保存されてしまうので、最後の一つの結果しか得られません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問