Skip to content

Instantly share code, notes, and snippets.

@KatsuhiroMorishita
Last active August 30, 2024 06:07
Show Gist options
  • Save KatsuhiroMorishita/083a9728918ea595ea472a1cb14f2b4c to your computer and use it in GitHub Desktop.
Save KatsuhiroMorishita/083a9728918ea595ea472a1cb14f2b4c to your computer and use it in GitHub Desktop.
一度にコピーできない様な調子の悪いSDカードからファイルをゆっくりコピーするPythonのプログラムです。
# purpose: ファイルをゆっくりコピーする
# PCの機能によるファイルコピーではデータを取り出せない様な、
# 調子の悪いSDカードからデータを取り出すために作製した。
# author: Katsuhiro Morishita
# created: 2023-10-24
# license: MIT
import os, glob, time
ROOT_READ = r"D:\RECORDER\FOLDER_A" # コピー元(適宜書き換え)
ROOT_SAVE = r"G:\test" # コピー先
# コピー元のファイル一覧取得
files = glob.glob(os.path.join(ROOT_READ, "*.mp3"))
# 取得したファイルのコピーを開始
for file in files:
# コピーするファイルのパスを表示して、コピー先のパスを作製
print(file)
fname = os.path.basename(file)
save_path = os.path.join(ROOT_SAVE, fname)
# コピー処理
while True: # 途中で中断を何度もするので無限ループで対応
try:
# コピー済みの分があれば、そのサイズを元ファイルと比較して、小さいときは途中から再開できるようにする
seek_ = 0 # 読み込み開始位置
size = os.path.getsize(file)
if os.path.exists(save_path) and size == os.path.getsize(save_path):
print("---already exists.---")
break
elif os.path.exists(save_path) and size > os.path.getsize(save_path): # 途中でコピーが止まっていた場合
seek_ = os.path.getsize(save_path)
print("---already exists. but small size...---")
# 少しずつファイルをコピーする
with open(file, "rb") as fr, open(save_path, "ab") as fw:
if seek_ != 0:
fr.seek(seek_)
count = seek_
while True:
data = fr.read(50000)
if data is None or len(data) == 0:
break
fw.write(data)
count += len(data)
print(f"{count}/{size}")
time.sleep(0.2)
print("")
break # 正常に処理が終われば、無限ループを抜ける
except Exception as e:
print(str(e))
print("retry.")
time.sleep(10)
# ファイルの更新時刻等を修正
t = os.path.getmtime(file)
os.utime(save_path, (t, t))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment