回答編集履歴
8
説明とコメントを追加
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
|
-
|
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
|
-
|
177
|
+
加工し終わったら、加工済みのファイル名とディレクトリパスを `os.path.join` を使って結合して、最終的な書き出し用パスを得ます。
|
158
178
|
|
159
179
|
|
160
180
|
|
7
出力例をコメントとして追加
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
説明を追加
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
|
-
|
133
|
+
|
96
|
-
|
97
|
-
|
98
|
-
|
134
|
+
|
99
|
-
```Python
|
135
|
+
```Python
|
136
|
+
|
100
|
-
|
137
|
+
filename = os.path.basename(filepath)
|
138
|
+
|
101
|
-
|
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
|
-
|
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
説明の区切りに水平線を追加
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
コードにコメントを追記
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
微細な修正
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, '
|
205
|
+
new_dirname = os.path.join(upper_dirname, 'export')
|
206
206
|
|
207
207
|
export_filepath = os.path.join(new_dirname, filename)
|
208
208
|
|
2
微細な修正
test
CHANGED
@@ -174,7 +174,7 @@
|
|
174
174
|
|
175
175
|
|
176
176
|
|
177
|
-
書き出し用のフォルダ(ここでは '
|
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, '
|
189
|
+
new_dirname = os.path.join(dirname, 'export')
|
190
190
|
|
191
191
|
export_filepath = os.path.join(new_dirname, filename)
|
192
192
|
|
1
説明を追記
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
|
+
相対パスを使用する場合は、カレントディレクトリを把握しておくことが重要になりますが、今回質問者さんは絶対パスを使用されていましたので、説明は省略させていただきます。
|