Pythonでできること2:ファイルの交換
概要:状況説明
既存のファイルを削除して新しいファイルをコピーします。
私の業務の例ですが、社内システム+RPAで使用されているExcelファイルがあり、そのExcelファイルを特定箇所で一元管理できないとのことです。
システムがアップデートされるごとにサーバー内に散らばった同じExcelを最新版に置き換える必要があります。
今回はその状況をイメージしてコードを作成しました。
使用するライブラリ
●os:ファイル操作
●shutil:高次のファイル操作
●(※参考用:実際は不要)glob:ファイルパスをまとめて取得
環境の説明
実環境をプチ再現しました。実際の指定フォルダは社内サーバーでした。
【メイン環境】
●削除したいファイルがあるフォルダ:folder_A~C
●交換したいファイル:交換用ファイル.txt
●関係ないファイル・フォルダ:photoes、exchange_file.ipynb
【交換(削除)するファイルがあるフォルダ内】
完成コード
実際のパスは社内サーバーですが、パスとファイル名を置き換えれば問題なく動きます。
"print() #説明用" の部分は説明用であり実際は不要なコードです。
import os, shutil, glob
#交換したいファイルを選択
#同じ階層ならglobで一括取得
# mainpaths = glob.glob('./folder*') #出力->['.\\folder_A', '.\\folder_B', '.\\folder_C']
#今回はフォルダパスがバラバラであることを想定
path1 = './folder_A'
path2 = './folder_B'
path3 = './folder_C'
mainpaths = [path1, path2, path3]
print(mainpaths)
#旧・新計画原価のファイル名を指定
old_excel = 'origin.txt'
new_excel = '交換用ファイル.txt'
#交換用のファイルパスを作成
oldfiles = [os.path.join(mainpath, old_excel) for mainpath in mainpaths]
print(oldfiles)
#既存フォルダからファイルを削除
for oldfile in oldfiles:
if os.path.exists(oldfile):
os.remove(oldfile)
print(f'{oldfile} を削除しました。')
else:
print(f'{oldfile} は存在しませんでした。')
#新しいファイルを指定フォルダにコピー
newfiles = [os.path.join(mainpath, new_excel) for mainpath in mainpaths]
print(newfiles)
for newfile in newfiles:
shutil.copy(new_excel, newfile)
print(f'{newfile} にファイルをコピーしました。')
コード解説
【1. メインパスを指定】
削除したいファイルがあるフォルダのパスを指定します。
[In]
path1 = './folder_A'
path2 = './folder_B'
path3 = './folder_C'
mainpaths = [path1, path2, path3]
print(mainpaths) #説明用
[Out]
['./folder_A', './folder_B', './folder_C']
(今回の想定とは異なりますが)もし指定フォルダが同じ階層になるならglob.glob('./folder*')でも取得可能です。この記載では「同じ階層にある頭がfolderから始まるファイル・フォルダをすべて選択する」ことと同義です。
[In]
mainpaths = glob.glob('./folder*') #出力->['.\\folder_A', '.\\folder_B', '.\\folder_C']
print(mainpaths)
[Out]
['.\\folder_A', '.\\folder_B', '.\\folder_C']
【2. ファイル名を指定】
交換前(削除用)ファイルと交換後ファイルのファイル名を指定します。
#旧・新計画原価のファイル名を指定
old_excel = 'origin.txt'
new_excel = '交換用ファイル.txt'
【3. 削除用ファイルパスの作成】
1.のパスと2.のファイル名を結合して削除用のファイルパスを作成します。
[In]
#交換用のファイルパスを作成
oldfiles = [os.path.join(mainpath, old_excel) for mainpath in mainpaths]
print(oldfiles) #説明用
[Out]
['./folder_A\\origin.txt', './folder_B\\origin.txt', './folder_C\\origin.txt']
【4. ファイルを削除】
3.で取得したパスからファイルを削除します。os.path.exists(filepath)でファイルの存在を確認して、存在の有無で処理を変えております。
[In]
#既存フォルダからファイルを削除
for oldfile in oldfiles:
if os.path.exists(oldfile):
os.remove(oldfile)
print(f'{oldfile} を削除しました。')
else:
print(f'{oldfile} は存在しませんでした。')
[Out]
./folder_A\origin.txt を削除しました。
./folder_B\origin.txt を削除しました。
./folder_C\origin.txt を削除しました。
【5. 新しいファイルをコピー先のファイルパスを作成】
1.のパスと2.のファイル名を結合して交換用のファイルパスを作成します。
[In]
#新しいファイルを指定フォルダにコピー
newfiles = [os.path.join(mainpath, new_excel) for mainpath in mainpaths]
print(newfiles) #説明用
[Out]
['./folder_A\\交換用ファイル.txt', './folder_B\\交換用ファイル.txt', './folder_C\\交換用ファイル.txt']
【6. 新しいファイルをコピー】
shutil.copy(コピー元ファイルパス, コピー先ファイルパス)でファイルをコピーします。もし同じファイルがあれば上書きされるため、上書きしたくない人は4. で使用したos.path.exists(filepath)を利用します。
[In]
for newfile in newfiles:
shutil.copy(new_excel, newfile)
print(f'{newfile} にファイルをコピーしました。')
[Out]
./folder_A\交換用ファイル.txt にファイルをコピーしました。
./folder_B\交換用ファイル.txt にファイルをコピーしました。
./folder_C\交換用ファイル.txt にファイルをコピーしました。
【結果:コード処理後】
あとがき
ファイル操作は慣れてないと間違ったときに大変なため、慣れないうちはローカルで練習しましょう。
この記事が気に入ったらサポートをしてみませんか?