完全なフォルダ構造を持つPythonを使用してファイルをコピーする

Nov 30 2020

SSDを数日でより良いものに切り替えていますが、削除すると後悔する可能性のある大量のデータが保存されています。必要なファイルの種類は、PDFファイル、docxファイル、txtファイルなどだけです。そこで、Pythonを使用してこれらのファイルを見つけるスクリプトを作成しました。

# to copy all of my documents into another location.
import sys
import os
import time
import pathlib
import json


filePath=["D:\\", "C:\\Users"]
# ext=['mkv','docx','doc','pdf','mp4','zip',]
fileExt=["**\*.docx","**\*.doc","**\*.pdf"]
fileList={}
for each_drive in filePath:
    fileList[each_drive]={}
    for each_type in fileExt:
        fileList[each_drive][each_type]=list(pathlib.Path(each_drive).glob(each_type))

file1 = open('test.txt', 'w')
for each in fileList.values():
    for each2 in each.values():
        for entry in each2:
            print(entry)
            file1.writelines(str(str(entry)+ "\n"))


file1.close()

このスクリプトは、FileExtリストに一致する形式でファイルを検索し、それらの場所をtest.txtファイルに書き込みます。次に、正確なディレクトリ構造を維持しながら、これらのファイルを転送する必要があります。たとえば、次のようなファイルがある場合

C:\Users\<MyUser>\AppData\Local\Files\S0\1\Attachments\hpe[4].docx

スクリプトは、ディレクトリ構造全体を次のようにコピーする必要があります。

<BackupDrive>:\<BackupFolderName>\C\Users\<MyUser>\AppData\Local\Files\S0\1\Attachments\hpe[4].docx

この正確な構造を使用してコピーするにはどうすればよいですか。
TLDR:Python
PSを使用しているのと同じようにディレクトリ構造を維持しながら、ファイルをコピーする必要があります。Python3.8でWindowsを使用しています。

回答

FloLie Nov 29 2020 at 23:20

ファイルリストの各行について、次の手順を実行します。

for filePath in fileList:
    destination = .join(['<BackupDrive>:\<BackupFolderName>', filePath[2:]])
    os.makedirs(os.path.dirname(filePath), exist_ok=True)
    shutil.copy(filePath , destination)
emmo Nov 29 2020 at 23:12

ファイルにデータを書き込むことができるので、そのファイルからデータを読み取る方法も知っていると思います。次に、各行に対して(たとえばsource、そのファイルで呼び出すには、を使用します)shutil.copyfile(source, dest)

次をdest操作して文字列を作成できますsource

# remove 'C:'
str_split = source[2:]

# add backup drive and folder
dest = ''.join(['<BackupDrive>:\<BackupFolderName>', str_split])

コメントで述べたように、宛先パスは自動的に作成されませんが、ここで説明されているように処理できます:shutil.copyファイルの宛先パスを作成します

CrYbAbY Nov 29 2020 at 23:54

@Emmoと@FloLieの回答に感謝します。リスト内の各ファイルに対してexist_okフラグをtrueに設定してos.makedirs()関数を使用する必要がありました。

これは、質問のコードの直後に配置されたコードです。

#######################################
# create destination directory
file1=open ('test.txt', 'r')
text= file1.readlines()
# print(text)
for each in text:
    each=each[:-1]
    destination="BackupDIR-"+each[0]+each[2:]
    os.makedirs(os.path.dirname(destination), exist_ok=True)
    shutil.copy(each,destination)

これにより、コード全体が次のようになります。

# to copy all of my documents into another location.
import os
import time
import pathlib
import json
import shutil


filePath=["D:\\", "C:\\Users"]
# ext=['mkv','docx','doc','pdf','mp4','zip',]
fileExt=["**\*.docx","**\*.doc","**\*.pdf"]
fileList={}
for each_drive in filePath:
    fileList[each_drive]={}
    for each_type in fileExt:
        fileList[each_drive][each_type]=list(pathlib.Path(each_drive).glob(each_type))

file1 = open('test.txt', 'w')
for each in fileList.values():
    for each2 in each.values():
        for entry in each2:
            print(entry)
            file1.writelines(str(str(entry)+ "\n"))
file1.close()

#######################################
# create destination directory
file1=open ('test.txt', 'r')
text= file1.readlines()
# print(text)
for each in text:
    each=each[:-1]
    destination="BackupDIR-"+each[0]+each[2:]
    os.makedirs(os.path.dirname(destination), exist_ok=True)
    shutil.copy(each,destination)

PSこの答えは、文脈から外れた小さなスニペットを理解できないことがある私のような人々のためだけにここにあります😁