回答編集履歴

5

追記

2022/11/08 12:22

投稿

TakaiY
TakaiY

スコア12774

test CHANGED
@@ -53,3 +53,45 @@
53
53
  という処理をする必要があります。
54
54
  また、ファイルを開いて処理をする場合、with open() を使ったほうがいいでしょう。
55
55
 
56
+ ---
57
+ 追記 その4
58
+
59
+ だいぶいい感じですね。
60
+ ただ、まだ、ファイルのパスがおかしいので、 Invalid argument になります。
61
+
62
+ > path = 'E:/VI' + json_file 
63
+ これでは、ディレクトリ名とファイル名の間に区切りがないので、正しいパスになりません。
64
+ 「path = 'E:/VI/' + json_file」こうしましょう。
65
+ 書き込むときに以下のように書いていますが、これはだめです。
66
+ > with open(path) as writer:
67
+ open関数は開くときのモードを指定することができ、何もしないと読み込みで開かれます。 これでは上書きできませんので、書き込みを指定する必要があります。ファイルを開くときはモードを意識するため、常にmodeオプションを指定するのがお勧めです。
68
+ ```python
69
+ with open(path, mode="w") as writer:
70
+ ```
71
+ ファイルのパスの指定がまちがえていなければ、たぶんこれで動くでしょう。
72
+
73
+ ただ、ファイルの内容を変更してそのまま上書きしてしまうのは何か起きたときに元のファイルがなくなってしまうので、ちょっと怖いです。
74
+ 変換後のファイルを入れるディレクトリを作ってそこに入れるなどするのがいいのではないかと思います。
75
+
76
+
77
+
78
+
79
+ >
80
+
81
+ ```python
82
+ import os
83
+
84
+ with open('E:/VI/list.txt') as f:
85
+ file_readlines = f.readlines()
86
+
87
+ for json_file in file_readlines:
88
+ if json_file.startswith('apple'):
89
+ path = 'E:/VI' + json_file 
90
+ with open(path) as reader: #Invalid argument
91
+ content = reader.read()
92
+
93
+ content = content.replace("label_index: 5", "label_index: 1")
94
+
95
+ with open(path) as writer:
96
+ writer.write(content)
97
+ ```

4

追記

2022/11/08 09:05

投稿

TakaiY
TakaiY

スコア12774

test CHANGED
@@ -34,3 +34,22 @@
34
34
  data_lines = data_lines.replace("label_index: 5", "label_index: 1")
35
35
  f.close()
36
36
  ```
37
+
38
+ ---
39
+ 追記その3
40
+
41
+ 変更された質問のコードは意図の通りです。
42
+
43
+ ただし、現状の f = open() 以降の処理では、ファイルの内容は変更されません。
44
+ ファイルを変更するのであれば、
45
+
46
+ - ファイルを開く
47
+ - 内容を読み込む
48
+ - 内容を編集する
49
+ - 出力用のファイルを開く
50
+ - 編集後の内容をファイルに書き出す
51
+ - 必要であれば編集前のファイルを編集後のファイルで置き換える。
52
+
53
+ という処理をする必要があります。
54
+ また、ファイルを開いて処理をする場合、with open() を使ったほうがいいでしょう。
55
+

3

バグ修正

2022/11/08 07:18

投稿

TakaiY
TakaiY

スコア12774

test CHANGED
@@ -23,13 +23,13 @@
23
23
  file_readlines にはファイル名のリストが入っていますので、それを1つずつ取り出して処理する必要があります。
24
24
  リストの内容を1つずつ処理するには、 「for xxx in リスト」の構文を使います。 このループでは、リストの要素が1つずつxxxに入れられてループが回ります。
25
25
 
26
- 処理するファイルめいのパスは、「E:/VI」を付けることでフルパスになるようですから、結合します。
26
+ 処理するファイルのパスは、「E:/VI」を付けることでフルパスになるようですから、結合します。
27
27
 
28
28
  なので、以下のようにすればいいでしょう。
29
29
  ```python
30
30
  for json_file in file_readlines:
31
31
  if json_file.startswith('apple'):
32
- path = 'E:/VI' + json_file
32
+ path = 'E:/VI/' + json_file
33
33
  f = open(path)
34
34
  data_lines = data_lines.replace("label_index: 5", "label_index: 1")
35
35
  f.close()

2

追記

2022/11/08 07:16

投稿

TakaiY
TakaiY

スコア12774

test CHANGED
@@ -15,4 +15,22 @@
15
15
  判定は読み込む前でも後でも特にかわりはないと思いますが。
16
16
  ひっかかっているポイントがよくわかりません。
17
17
 
18
+ ---
19
+ 追記その2
18
20
 
21
+ strはモジュール名と被っているので使いません。
22
+
23
+ file_readlines にはファイル名のリストが入っていますので、それを1つずつ取り出して処理する必要があります。
24
+ リストの内容を1つずつ処理するには、 「for xxx in リスト」の構文を使います。 このループでは、リストの要素が1つずつxxxに入れられてループが回ります。
25
+
26
+ 処理するファイルめいのパスは、「E:/VI」を付けることでフルパスになるようですから、結合します。
27
+
28
+ なので、以下のようにすればいいでしょう。
29
+ ```python
30
+ for json_file in file_readlines:
31
+ if json_file.startswith('apple'):
32
+ path = 'E:/VI' + json_file
33
+ f = open(path)
34
+ data_lines = data_lines.replace("label_index: 5", "label_index: 1")
35
+ f.close()
36
+ ```

1

質問を受けて追記

2022/11/06 07:05

投稿

TakaiY
TakaiY

スコア12774

test CHANGED
@@ -2,3 +2,17 @@
2
2
  - ファイル名がapple1とapple2(以下列挙)ならindex_labelは1、banana1とbanana2.とbanana3(以下列挙)ならindex_labelは2に、(以下同様)というような情報を作ってファイル名からindex_labelの値を判断する。
3
3
  - ファイル名が 「apple」で始まっていればindex_labelは1、「banana」で始まっていればindex_labelは2、(以下同様)というような情報を作ってファイル名からindex_labelの値を判断する
4
4
  のような感じでどうでしょう。
5
+
6
+ ---
7
+ 追記
8
+
9
+ > そこでstartswithメソッドを使って、ファイル名の判別をしようと考えました
10
+ はい。
11
+
12
+ > このメソッドは引数にリストを指定することができないようで詰まってしまいました。 先にファイルを読み込み、情報と一致するかを判別するというアプローチで考えればいいでしょうか。
13
+
14
+ ということはファイル名のリストは持っているのですよね? 開く時は1つずつファイルを扱っているはずですから、そのときのファイル名を startwith で判定して処理すればいいのではないでしょうか?
15
+ 判定は読み込む前でも後でも特にかわりはないと思いますが。
16
+ ひっかかっているポイントがよくわかりません。
17
+
18
+