回答編集履歴

8

説明とコメントを追加

2021/07/13 04:15

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -84,7 +84,15 @@
84
84
 
85
85
 
86
86
 
87
+ glob のパス指定で、'C:\Users\Tanaka\Documents\checksheet\*.xlsx' といった 'C:\' から始まるパスを指定した場合は、絶対パスで指定したことになります(これに対して、相対パスで指定する方法もありますが、ここでは詳細は省きます)。
88
+
89
+
90
+
87
- glob のパス指定で絶対パスを使用した場合は、取得されるパスも絶対パスになりますので、ファイル名とディレクトリパスに分割してから処理します。
91
+ 絶対パスを使用した場合は、取得されるファイルのパスも絶対パスになりますので、このパスを加工する場合は、ファイル名とディレクトリパスに分割してから処理するのがやりやすいです
92
+
93
+
94
+
95
+ 以下は簡単なサンプルコードです。
88
96
 
89
97
 
90
98
 
@@ -100,21 +108,29 @@
100
108
 
101
109
  for filepath in filepaths:
102
110
 
111
+         # 取得されるファイルのパスは絶対パス
112
+
103
113
          print(filepath) # => C:\Users\Tanaka\Documents\checksheet\xxxx.xlsx
104
114
 
115
+         # 絶対パスからファイル名のみを取り出す
116
+
105
117
  filename = os.path.basename(filepath)
106
118
 
107
119
  print(filename) # => xxxx.xlsx
108
120
 
121
+         # 絶対パスからファイル名を除いたディレクトリパスの部分だけを取り出す
122
+
109
123
  dirname = os.path.dirname(filepath)
110
124
 
111
125
  print(dirname) # => C:\Users\Tanaka\Documents\checksheet
112
126
 
127
+         # ファイル名とディレクトリパスを結合して再度ファイルの絶対パスを作成する
128
+
113
129
  new_path = os.path.join(dirname, filename)
114
130
 
115
131
  print(new_path) # => C:\Users\Tanaka\Documents\checksheet\xxxx.xlsx
116
132
 
117
- print('---')
133
+ print()
118
134
 
119
135
 
120
136
 
@@ -126,6 +142,10 @@
126
142
 
127
143
 
128
144
 
145
+ 以下簡単に説明します。
146
+
147
+
148
+
129
149
  ファイル名とディレクトリパスに分割するには
130
150
 
131
151
  `os.path.basename` と `os.path.dirname` を使います。もしくは `os.path.split` を使います。
@@ -148,13 +168,13 @@
148
168
 
149
169
 
150
170
 
151
- 取得したファイル名とディレクトリパスを、ファイルの書き出し使用したいファイルパスに合わせて加工します。
171
+ 分割した後に、取得したファイル名とディレクトリパスを、書き出すファイルはどんなファイル名で、どこディレクトリ保存したいに合わせて加工します。
152
-
172
+
153
- 同じファイル名ディレクトリパスでよければそのままでもいいです。
173
+ 同じファイル名ディレクトリパスでよければそのままでもいいです。
154
-
155
-
156
-
174
+
175
+
176
+
157
- `os.path.join` を使、加工済みのファイル名とディレクトリパスを結合して、最終的なパスを得ます。
177
+ 加工し終わたら、加工済みのファイル名とディレクトリパスを `os.path.join` を使って結合して、最終的な書き出し用パスを得ます。
158
178
 
159
179
 
160
180
 

7

出力例をコメントとして追加

2021/07/13 04:14

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -100,19 +100,19 @@
100
100
 
101
101
  for filepath in filepaths:
102
102
 
103
-         print(filepath)
103
+         print(filepath) # => C:\Users\Tanaka\Documents\checksheet\xxxx.xlsx
104
104
 
105
105
  filename = os.path.basename(filepath)
106
106
 
107
- print(filename)
107
+ print(filename) # => xxxx.xlsx
108
108
 
109
109
  dirname = os.path.dirname(filepath)
110
110
 
111
- print(dirname)
111
+ print(dirname) # => C:\Users\Tanaka\Documents\checksheet
112
112
 
113
113
  new_path = os.path.join(dirname, filename)
114
114
 
115
- print(new_path)
115
+ print(new_path) # => C:\Users\Tanaka\Documents\checksheet\xxxx.xlsx
116
116
 
117
117
  print('---')
118
118
 

6

説明を追加

2021/07/12 12:56

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -88,138 +88,174 @@
88
88
 
89
89
 
90
90
 
91
+ ```Python
92
+
93
+ from glob import glob
94
+
95
+ import os
96
+
97
+
98
+
99
+ filepaths = glob('C:\Users\Tanaka\Documents\checksheet\*.xlsx')
100
+
101
+ for filepath in filepaths:
102
+
103
+         print(filepath)
104
+
105
+ filename = os.path.basename(filepath)
106
+
107
+ print(filename)
108
+
109
+ dirname = os.path.dirname(filepath)
110
+
111
+ print(dirname)
112
+
113
+ new_path = os.path.join(dirname, filename)
114
+
115
+ print(new_path)
116
+
117
+ print('---')
118
+
119
+
120
+
121
+ # 次のようにしてファイル名とディレクトリパスを一度に取得してもよい
122
+
123
+ dirname, filename = os.path.split(filepath)
124
+
125
+ ```
126
+
127
+
128
+
91
129
  ファイル名とディレクトリパスに分割するには
92
130
 
93
131
  `os.path.basename` と `os.path.dirname` を使います。もしくは `os.path.split` を使います。
94
132
 
95
- 処理済みのファイル名とディレクトリパスを結合して最終的なパスを得るには `os.path.join` を使います。
133
+
96
-
97
-
98
-
134
+
99
- ```Python
135
+ ```Python
136
+
100
-
137
+ filename = os.path.basename(filepath)
138
+
101
- from glob import glob
139
+ dirname = os.path.dirname(filepath)
140
+
141
+
142
+
102
-
143
+ # もしくは
144
+
145
+ dirname, filename = os.path.split(filepath)
146
+
147
+ ```
148
+
149
+
150
+
151
+ 取得したファイル名とディレクトリパスを、ファイルの書き出しに使用したいファイルパスに合わせて加工します。
152
+
153
+ 同じファイル名・ディレクトリパスでよければそのままでもいいです。
154
+
155
+
156
+
157
+ `os.path.join` を使って、加工済みのファイル名とディレクトリパスを結合して、最終的なパスを得ます。
158
+
159
+
160
+
103
- import os
161
+ ```Python
162
+
104
-
163
+ new_path = os.path.join(dirname, filename)
164
+
105
-
165
+ ```
166
+
167
+
168
+
169
+ 以下に具体的な例をいくつか挙げます。
170
+
171
+
172
+
173
+ 書き出しファイル名に共通の接頭辞(ここでは'export_')をつけて同じフォルダに保存する場合:
174
+
175
+
176
+
177
+ ```Python
178
+
179
+ for filepath in filepaths:
180
+
181
+ dirname, filename = os.path.split(filepath)
182
+
183
+ new_filename = 'export_' + filename # ファイル名を加工
184
+
185
+ export_filepath = os.path.join(dirname, new_filename)
186
+
187
+ print(export_filepath)
188
+
189
+ ```
190
+
191
+
192
+
193
+ 書き出しファイル名に連番を振って同じフォルダに保存する場合:
194
+
195
+
196
+
197
+ ```Python
198
+
199
+ for idx, filepath in enumerate(filepaths):
200
+
201
+ dirname, filename = os.path.split(filepath)
202
+
203
+ new_filename = filename.replace(".xlsx", f"_{idx:03}.xlsx") # ファイル名を加工
204
+
205
+ export_filepath = os.path.join(dirname, new_filename)
206
+
207
+ print(export_filepath)
208
+
209
+ ```
210
+
211
+
212
+
213
+ 書き出し用のフォルダ(ここでは 'export')を作ってそこに元と同じファイル名で保存する場合:
214
+
215
+
216
+
217
+ ```Python
218
+
219
+ # 書き出し用のフォルダを元のフォルダの中に作った場合
220
+
221
+ for filepath in filepaths:
222
+
223
+ dirname, filename = os.path.split(filepath)
224
+
225
+ new_dirname = os.path.join(dirname, 'export') # 元のフォルダ + exportフォルダ
226
+
227
+ export_filepath = os.path.join(new_dirname, filename)
228
+
229
+ print(export_filepath)
230
+
231
+
232
+
233
+ # 書き出し用のフォルダを元のフォルダと同じ階層に作った場合
234
+
235
+ for filepath in filepaths:
236
+
237
+ dirname, filename = os.path.split(filepath)
238
+
239
+ upper_dirname = os.path.dirname(dirname) # 元のフォルダのひとつ上の階層のパスを取得
240
+
241
+ new_dirname = os.path.join(upper_dirname, 'export') # ひとつ上の階層 + exportフォルダ
242
+
243
+ export_filepath = os.path.join(new_dirname, filename)
244
+
245
+ print(export_filepath)
246
+
247
+ ```
248
+
249
+
250
+
251
+ なお、raw文字列(r'xxx')を使うと、その文字列内のエスケープ ('\') は、エスケープとしての特別な機能を失ってただの文字列になります。そのため下記のコードは、
252
+
253
+
254
+
255
+ ```Python
106
256
 
107
257
  filepaths = glob('C:\Users\Tanaka\Documents\checksheet\*.xlsx')
108
258
 
109
- for filepath in filepaths:
110
-
111
-         print(filepath)
112
-
113
- filename = os.path.basename(filepath)
114
-
115
- print(filename)
116
-
117
- dirname = os.path.dirname(filepath)
118
-
119
- print(dirname)
120
-
121
- new_path = os.path.join(dirname, filename)
122
-
123
- print(new_path)
124
-
125
- print('---')
126
-
127
-
128
-
129
- # 次のようにしてファイル名とディレクトリパスを一度に取得してもよい
130
-
131
- dirname, filename = os.path.split(filepath)
132
-
133
- ```
134
-
135
-
136
-
137
- 書き出しファイル名に共通の接頭辞(ここでは'export_')をつけて同じフォルダに保存する場合:
138
-
139
-
140
-
141
- ```Python
142
-
143
- for filepath in filepaths:
144
-
145
- dirname, filename = os.path.split(filepath)
146
-
147
- new_filename = 'export_' + filename
148
-
149
- export_filepath = os.path.join(dirname, new_filename)
150
-
151
- print(export_filepath)
152
-
153
- ```
154
-
155
-
156
-
157
- 書き出しファイル名に連番を振って同じフォルダに保存する場合:
158
-
159
-
160
-
161
- ```Python
162
-
163
- for idx, filepath in enumerate(filepaths):
164
-
165
- dirname, filename = os.path.split(filepath)
166
-
167
- new_filename = filename.replace(".xlsx", f"_{idx:03}.xlsx")
168
-
169
- export_filepath = os.path.join(dirname, new_filename)
170
-
171
- print(export_filepath)
172
-
173
- ```
174
-
175
-
176
-
177
- 書き出し用のフォルダ(ここでは 'export')を作ってそこに元と同じファイル名で保存する場合:
178
-
179
-
180
-
181
- ```Python
182
-
183
- # 書き出し用のフォルダを元のフォルダの中に作った場合
184
-
185
- for filepath in filepaths:
186
-
187
- dirname, filename = os.path.split(filepath)
188
-
189
- new_dirname = os.path.join(dirname, 'export')
190
-
191
- export_filepath = os.path.join(new_dirname, filename)
192
-
193
- print(export_filepath)
194
-
195
-
196
-
197
- # 書き出し用のフォルダを元のフォルダと同じ階層に作った場合
198
-
199
- for filepath in filepaths:
200
-
201
- dirname, filename = os.path.split(filepath)
202
-
203
- upper_dirname = os.path.dirname(dirname) # 元のフォルダのひとつ上の階層のパスを取得
204
-
205
- new_dirname = os.path.join(upper_dirname, 'export')
206
-
207
- export_filepath = os.path.join(new_dirname, filename)
208
-
209
- print(export_filepath)
210
-
211
- ```
212
-
213
-
214
-
215
- なお、raw文字列(r'xxx')を使うと、その文字列内のエスケープ ('\') は、エスケープとしての特別な機能を失ってただの文字列になります。そのため下記のコードは、
216
-
217
-
218
-
219
- ```Python
220
-
221
- filepaths = glob('C:\Users\Tanaka\Documents\checksheet\*.xlsx')
222
-
223
259
  ```
224
260
 
225
261
  raw文字列を使って次のように書くこともできます。

5

説明の区切りに水平線を追加

2021/07/12 12:52

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -234,6 +234,10 @@
234
234
 
235
235
 
236
236
 
237
+ ---
238
+
239
+
240
+
237
241
  `os.getcwd()` はカレントディレクトリを確認するためのコードです。
238
242
 
239
243
  相対パスを使用する場合は、カレントディレクトリを把握しておくことが重要になりますが、今回質問者さんは絶対パスを使用されていましたので、説明は省略させていただきます。

4

コードにコメントを追記

2021/07/12 12:31

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -200,7 +200,7 @@
200
200
 
201
201
  dirname, filename = os.path.split(filepath)
202
202
 
203
- upper_dirname = os.path.dirname(dirname)
203
+ upper_dirname = os.path.dirname(dirname) # 元のフォルダのひとつ上の階層のパスを取得
204
204
 
205
205
  new_dirname = os.path.join(upper_dirname, 'export')
206
206
 

3

微細な修正

2021/07/12 12:29

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -202,7 +202,7 @@
202
202
 
203
203
  upper_dirname = os.path.dirname(dirname)
204
204
 
205
- new_dirname = os.path.join(upper_dirname, 'checksheet_out')
205
+ new_dirname = os.path.join(upper_dirname, 'export')
206
206
 
207
207
  export_filepath = os.path.join(new_dirname, filename)
208
208
 

2

微細な修正

2021/07/12 08:46

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -174,7 +174,7 @@
174
174
 
175
175
 
176
176
 
177
- 書き出し用のフォルダ(ここでは 'checksheet_out')を作ってそこに元と同じファイル名で保存する場合:
177
+ 書き出し用のフォルダ(ここでは 'export')を作ってそこに元と同じファイル名で保存する場合:
178
178
 
179
179
 
180
180
 
@@ -186,7 +186,7 @@
186
186
 
187
187
  dirname, filename = os.path.split(filepath)
188
188
 
189
- new_dirname = os.path.join(dirname, 'checksheet_out')
189
+ new_dirname = os.path.join(dirname, 'export')
190
190
 
191
191
  export_filepath = os.path.join(new_dirname, filename)
192
192
 

1

説明を追記

2021/07/12 08:45

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -73,3 +73,167 @@
73
73
  workbook.save(export_file)
74
74
 
75
75
  ```
76
+
77
+
78
+
79
+ ---
80
+
81
+
82
+
83
+ ## 追記:glob のパス指定で絶対パスを使用した場合
84
+
85
+
86
+
87
+ glob のパス指定で絶対パスを使用した場合は、取得されるパスも絶対パスになりますので、ファイル名とディレクトリパスに分割してから処理します。
88
+
89
+
90
+
91
+ ファイル名とディレクトリパスに分割するには
92
+
93
+ `os.path.basename` と `os.path.dirname` を使います。もしくは `os.path.split` を使います。
94
+
95
+ 処理済みのファイル名とディレクトリパスを結合して最終的なパスを得るには `os.path.join` を使います。
96
+
97
+
98
+
99
+ ```Python
100
+
101
+ from glob import glob
102
+
103
+ import os
104
+
105
+
106
+
107
+ filepaths = glob('C:\Users\Tanaka\Documents\checksheet\*.xlsx')
108
+
109
+ for filepath in filepaths:
110
+
111
+         print(filepath)
112
+
113
+ filename = os.path.basename(filepath)
114
+
115
+ print(filename)
116
+
117
+ dirname = os.path.dirname(filepath)
118
+
119
+ print(dirname)
120
+
121
+ new_path = os.path.join(dirname, filename)
122
+
123
+ print(new_path)
124
+
125
+ print('---')
126
+
127
+
128
+
129
+ # 次のようにしてファイル名とディレクトリパスを一度に取得してもよい
130
+
131
+ dirname, filename = os.path.split(filepath)
132
+
133
+ ```
134
+
135
+
136
+
137
+ 書き出しファイル名に共通の接頭辞(ここでは'export_')をつけて同じフォルダに保存する場合:
138
+
139
+
140
+
141
+ ```Python
142
+
143
+ for filepath in filepaths:
144
+
145
+ dirname, filename = os.path.split(filepath)
146
+
147
+ new_filename = 'export_' + filename
148
+
149
+ export_filepath = os.path.join(dirname, new_filename)
150
+
151
+ print(export_filepath)
152
+
153
+ ```
154
+
155
+
156
+
157
+ 書き出しファイル名に連番を振って同じフォルダに保存する場合:
158
+
159
+
160
+
161
+ ```Python
162
+
163
+ for idx, filepath in enumerate(filepaths):
164
+
165
+ dirname, filename = os.path.split(filepath)
166
+
167
+ new_filename = filename.replace(".xlsx", f"_{idx:03}.xlsx")
168
+
169
+ export_filepath = os.path.join(dirname, new_filename)
170
+
171
+ print(export_filepath)
172
+
173
+ ```
174
+
175
+
176
+
177
+ 書き出し用のフォルダ(ここでは 'checksheet_out')を作ってそこに元と同じファイル名で保存する場合:
178
+
179
+
180
+
181
+ ```Python
182
+
183
+ # 書き出し用のフォルダを元のフォルダの中に作った場合
184
+
185
+ for filepath in filepaths:
186
+
187
+ dirname, filename = os.path.split(filepath)
188
+
189
+ new_dirname = os.path.join(dirname, 'checksheet_out')
190
+
191
+ export_filepath = os.path.join(new_dirname, filename)
192
+
193
+ print(export_filepath)
194
+
195
+
196
+
197
+ # 書き出し用のフォルダを元のフォルダと同じ階層に作った場合
198
+
199
+ for filepath in filepaths:
200
+
201
+ dirname, filename = os.path.split(filepath)
202
+
203
+ upper_dirname = os.path.dirname(dirname)
204
+
205
+ new_dirname = os.path.join(upper_dirname, 'checksheet_out')
206
+
207
+ export_filepath = os.path.join(new_dirname, filename)
208
+
209
+ print(export_filepath)
210
+
211
+ ```
212
+
213
+
214
+
215
+ なお、raw文字列(r'xxx')を使うと、その文字列内のエスケープ ('\') は、エスケープとしての特別な機能を失ってただの文字列になります。そのため下記のコードは、
216
+
217
+
218
+
219
+ ```Python
220
+
221
+ filepaths = glob('C:\Users\Tanaka\Documents\checksheet\*.xlsx')
222
+
223
+ ```
224
+
225
+ raw文字列を使って次のように書くこともできます。
226
+
227
+
228
+
229
+ ```Python
230
+
231
+ filepaths = glob(r'C:\Users\Tanaka\Documents\checksheet*.xlsx')
232
+
233
+ ```
234
+
235
+
236
+
237
+ `os.getcwd()` はカレントディレクトリを確認するためのコードです。
238
+
239
+ 相対パスを使用する場合は、カレントディレクトリを把握しておくことが重要になりますが、今回質問者さんは絶対パスを使用されていましたので、説明は省略させていただきます。