見出し画像

Pythonでできること2:ファイルの交換

概要:状況説明

既存のファイルを削除して新しいファイルをコピーします。
私の業務の例ですが、社内システム+RPAで使用されているExcelファイルがあり、そのExcelファイルを特定箇所で一元管理できないとのことです。
システムがアップデートされるごとにサーバー内に散らばった同じExcelを最新版に置き換える必要があります。
今回はその状況をイメージしてコードを作成しました。

使用するライブラリ

●os:ファイル操作
●shutil:高次のファイル操作
●(※参考用:実際は不要)glob:ファイルパスをまとめて取得

環境の説明

実環境をプチ再現しました。実際の指定フォルダは社内サーバーでした。

【メイン環境】
●削除したいファイルがあるフォルダ:folder_A~C
●交換したいファイル:交換用ファイル.txt
●関係ないファイル・フォルダ:photoes説明用写真置き場exchange_file.ipynbコード作成用

画像1

【交換(削除)するファイルがあるフォルダ内】

画像2

完成コード

実際のパスは社内サーバーですが、パスとファイル名を置き換えれば問題なく動きます。
"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 にファイルをコピーしました。

【結果:コード処理後】

画像3

あとがき

ファイル操作は慣れてないと間違ったときに大変なため、慣れないうちはローカルで練習しましょう。

この記事が気に入ったらサポートをしてみませんか?