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

回答編集履歴

1

回答の追記

2021/11/08 06:55

投稿

etherbeg
etherbeg

スコア1195

answer CHANGED
@@ -8,4 +8,76 @@
8
8
  data = XML_preprocessor('C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション\').data
9
9
  ```
10
10
 
11
- に変えて実行してください。
11
+ に変えて実行してください。
12
+
13
+ ---
14
+
15
+ **コメントを受けての追記:**
16
+
17
+ このプログラムは、指定されたディレクトリにある複数のxmlファイルをpklファイルにまとめるプログラム、とのことでした。
18
+
19
+ ディレクトリの指定は、
20
+
21
+ ```python
22
+ data = XML_preprocessor(ディレクトリパス).data
23
+ ```
24
+
25
+ という形で行います。
26
+ 処理対象のxmlファイルを見つけるために、プログラムの内部では次のようなプロセスで処理が進行します。
27
+
28
+ 0. ディレクトリパスで示されたディレクトリにあるファイルのファイル名をすべて取得する
29
+ 0. 取得されたファイル名のひとつひとつについて、ディレクトリパスとファイル名を結合する
30
+ 0. 結合の結果得られたファイルパスが示すファイルをxmlパーサに読み込む
31
+
32
+ ディレクトリパスとファイル名を結合する際には、単純に文字列の結合が使われています。
33
+ このため、例えばディレクトリパスに
34
+ 'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション'
35
+ を指定した場合、そのディレクトリにあるファイル名 'example.xml' との結合の結果は、以下のようになります。
36
+
37
+ ```python
38
+ >>> 'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション' + 'example.xml'
39
+ 使うデータ\お試しアノテーション' + 'example.xml'
40
+ 'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーションexample.xml'
41
+ ```
42
+
43
+ 「'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーションexample.xml'」というファイルパスが得られました。
44
+ この結果、「リンゴ検出に使うデータ」ディレクトリにある「お試しアノテーションexample.xml」という名前のファイルが探されることになり、そのようなファイルがないため、FileNotFoundErrorエラーとなります。
45
+
46
+ このような問題が生じていることは、エラーメッセージの最終行に示されているファイルパスを確認することによって推測できます。
47
+
48
+ ```sh
49
+ FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーションLINE_ALBUM_%25E3%2582%258A%25E3%2582%2593%25E3%2581%2594_211011_53.xml'
50
+ ```
51
+
52
+ ディレクトリパスの指定の際に、ディレクトリ名の最後にパス区切りを付加しておくことにより、
53
+
54
+ ```python
55
+ >>> 'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション\' + 'example.xml'
56
+ 使うデータ\お試しアノテーション' + 'example.xml'
57
+ 'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション\example.xml'
58
+ ```
59
+ 以上のように正しいファイルパスが得られます。
60
+
61
+ 私は、ディレクトリパスの指定の際に、最後にパス区切りを付加するかしないかによって、プログラムが正しく動いたり動かなかったりするこのようなプログラムは、プログラムとして問題があると考えます。
62
+ これからも長く使うプログラムであれば、プログラムを次のように修正しておくことをお勧めします。
63
+
64
+ ```python
65
+ (前略)
66
+ class XML_preprocessor(object):
67
+
68
+ def __init__(self, data_path):
69
+ self.path_prefix = data_path
70
+ self.num_classes = 1
71
+ self.data = dict()
72
+ self._preprocess_XML()
73
+
74
+ def _preprocess_XML(self):
75
+ filenames = os.listdir(self.path_prefix)
76
+ for filename in filenames:
77
+ #tree = ElementTree.parse(self.path_prefix + filename) # この1行を以下の1行に変更
78
+ tree = ElementTree.parse(os.path.join(self.path_prefix, filename))
79
+ root = tree.getroot()
80
+ (後略)
81
+ ```
82
+
83
+ この変更により、ディレクトリパスの指定の最後にパス区切りがあってもなくても、プログラムが正しく動作するようになります。