Pythonではfor文で繰り返し処理ができます。
Python
1for filepath in filepaths:
2 print(filepath)
3 export_file = 'export_' + filepath # export_ファイル名.xlsx
4 print(export_file)
連番を振る必要があるなら enumerate()
を使えます。
Python
1for idx, filepath in enumerate(filepaths):
2 print(filepath)
3 export_file = filepath.replace(".xlsx", f"_{idx:03}.xlsx") # ファイル名_000.xlsx
4 print(export_file)
書き出し用のフォルダを作っておいてそこに元と同じファイル名で保存する方法もあります。
Python
1for filepath in filepaths:
2 print(filepath)
3 export_file = 'export/' + filepath # exportフォルダに保存(Windowsだと 'export\' かも)
4 print(export_file)
df = pd.read_excel(filepath)
と df.to_excel(export_file)
は不要ではないでしょうか。
Python
1for filepath in filepaths:
2 workbook = openpyxl.load_workbook(filepath)
3 # ...
4 # workbookに対する処理を行う
5 # ...
6 export_file = 'export_' + filepath
7 workbook.save(export_file)
追記:glob のパス指定で絶対パスを使用した場合
glob のパス指定で、'C:\Users\Tanaka\Documents\checksheet*.xlsx' といった 'C:' から始まるパスを指定した場合は、絶対パスで指定したことになります(これに対して、相対パスで指定する方法もありますが、ここでは詳細は省きます)。
絶対パスを使用した場合は、取得されるファイルのパスも絶対パスになりますので、このパスを加工する場合は、ファイル名とディレクトリパスに分割してから処理するのがやりやすいです。
以下は簡単なサンプルコードです。
Python
1from glob import glob
2import os
3
4filepaths = glob('C:\Users\Tanaka\Documents\checksheet\*.xlsx')
5for filepath in filepaths:
6 # 取得されるファイルのパスは絶対パス
7 print(filepath) # => C:\Users\Tanaka\Documents\checksheet\xxxx.xlsx
8 # 絶対パスからファイル名のみを取り出す
9 filename = os.path.basename(filepath)
10 print(filename) # => xxxx.xlsx
11 # 絶対パスからファイル名を除いたディレクトリパスの部分だけを取り出す
12 dirname = os.path.dirname(filepath)
13 print(dirname) # => C:\Users\Tanaka\Documents\checksheet
14 # ファイル名とディレクトリパスを結合して再度ファイルの絶対パスを作成する
15 new_path = os.path.join(dirname, filename)
16 print(new_path) # => C:\Users\Tanaka\Documents\checksheet\xxxx.xlsx
17 print()
18
19 # 次のようにしてファイル名とディレクトリパスを一度に取得してもよい
20 dirname, filename = os.path.split(filepath)
以下簡単に説明します。
ファイル名とディレクトリパスに分割するには
os.path.basename
と os.path.dirname
を使います。もしくは os.path.split
を使います。
Python
1filename = os.path.basename(filepath)
2dirname = os.path.dirname(filepath)
3
4# もしくは
5dirname, filename = os.path.split(filepath)
分割した後に、取得したファイル名とディレクトリパスを、書き出すファイルはどんなファイル名で、どこのディレクトリに保存したいかに合わせて加工します。
同じファイル名やディレクトリパスでよければそのままでもいいです。
加工し終わったら、加工済みのファイル名とディレクトリパスを os.path.join
を使って結合して、最終的な書き出し用パスを得ます。
Python
1new_path = os.path.join(dirname, filename)
以下に具体的な例をいくつか挙げます。
書き出しファイル名に共通の接頭辞(ここでは'export_')をつけて同じフォルダに保存する場合:
Python
1for filepath in filepaths:
2 dirname, filename = os.path.split(filepath)
3 new_filename = 'export_' + filename # ファイル名を加工
4 export_filepath = os.path.join(dirname, new_filename)
5 print(export_filepath)
書き出しファイル名に連番を振って同じフォルダに保存する場合:
Python
1for idx, filepath in enumerate(filepaths):
2 dirname, filename = os.path.split(filepath)
3 new_filename = filename.replace(".xlsx", f"_{idx:03}.xlsx") # ファイル名を加工
4 export_filepath = os.path.join(dirname, new_filename)
5 print(export_filepath)
書き出し用のフォルダ(ここでは 'export')を作ってそこに元と同じファイル名で保存する場合:
Python
1# 書き出し用のフォルダを元のフォルダの中に作った場合
2for filepath in filepaths:
3 dirname, filename = os.path.split(filepath)
4 new_dirname = os.path.join(dirname, 'export') # 元のフォルダ + exportフォルダ
5 export_filepath = os.path.join(new_dirname, filename)
6 print(export_filepath)
7
8# 書き出し用のフォルダを元のフォルダと同じ階層に作った場合
9for filepath in filepaths:
10 dirname, filename = os.path.split(filepath)
11 upper_dirname = os.path.dirname(dirname) # 元のフォルダのひとつ上の階層のパスを取得
12 new_dirname = os.path.join(upper_dirname, 'export') # ひとつ上の階層 + exportフォルダ
13 export_filepath = os.path.join(new_dirname, filename)
14 print(export_filepath)
なお、raw文字列(r'xxx')を使うと、その文字列内のエスケープ ('') は、エスケープとしての特別な機能を失ってただの文字列になります。そのため下記のコードは、
Python
1filepaths = glob('C:\Users\Tanaka\Documents\checksheet\*.xlsx')
raw文字列を使って次のように書くこともできます。
Python
1filepaths = glob(r'C:\Users\Tanaka\Documents\checksheet*.xlsx')
os.getcwd()
はカレントディレクトリを確認するためのコードです。
相対パスを使用する場合は、カレントディレクトリを把握しておくことが重要になりますが、今回質問者さんは絶対パスを使用されていましたので、説明は省略させていただきます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/08 04:02
2021/07/08 14:08 編集
2021/07/08 22:17
2021/07/12 02:48
2021/07/12 07:44
2021/07/14 09:49