Kursus Python / Menyalin berkas dengan dry run dan pemeriksaan hasil
Mulai otomatisasi berkas dengan memisahkan pratinjau rencana dari penerapan perubahan. Latihan ini menyalin berkas teks ke lokasi keluaran dan menolak target yang sudah ada, sambil mempertahankan berkas sumber.
Tentukan cakupan dan siapkan data terpisah
Gunakan folder latihan baru yang boleh berisi data percobaan. Contoh memakai copy-demo/in dan copy-demo/out di bawah working directory. Ia tidak mencari subfolder secara rekursif dan mengecualikan entri symbolic link pada daftar sumber. Tidak ada operasi pemindahan atau penghapusan sumber.
Periksa basis path relatif dan folder kerja sebelum menjalankan. Penyalinan, pemeriksaan isi, dan pembersihan dipisahkan agar kegagalan mudah ditelusuri. Kebijakan benturan nama contoh ini adalah berhenti, bukan mengganti nama secara diam-diam.
Gunakan Python 3.12 atau lebih baru melalui lingkungan proyek. Simpan semua berkas sumber dengan encoding UTF-8. Pertama simpan kode Python lengkap berikut sebagai setup_copy.py, lalu jalankan python setup_copy.py satu kali.
from pathlib import Path
source = Path("copy-demo/in")
source.mkdir(parents=True, exist_ok=True)
with (source / "note.txt").open("x", encoding="utf-8") as f:
f.write("demo\n")
print("sample ready")
Keluaran sample ready berarti fixture copy-demo/in/note.txt telah dibuat. Mode x menolak berkas contoh yang sudah ada, sehingga pengulangan persiapan dapat berhenti dengan FileExistsError. Persiapan memang menulis data; sifat pratinjau tanpa penulisan berlaku pada alat penyalin berikutnya, bukan pada tahap persiapan ini.
Periksa dry run sebelum menerapkan salinan
Simpan kode lengkap berikut sebagai safe_copy.py pada folder latihan yang sama. Setelah persiapan selesai, jalankan python safe_copy.py tanpa opsi tambahan.
import argparse
import hashlib
import shutil
from pathlib import Path
parser = argparse.ArgumentParser()
parser.add_argument("--apply", action="store_true")
args = parser.parse_args()
source, target = Path("copy-demo/in"), Path("copy-demo/out")
if not source.is_dir():
parser.error("prepare copy-demo/in first")
files = sorted(p for p in source.glob("*.txt") if p.is_file() and not p.is_symlink())
for src in files:
dst = target / src.name
if dst.exists() or dst.is_symlink():
raise FileExistsError(dst)
print("copy", src.name)
if args.apply:
target.mkdir(parents=True, exist_ok=True)
with src.open("rb") as incoming, dst.open("xb") as outgoing:
shutil.copyfileobj(incoming, outgoing)
if hashlib.sha256(src.read_bytes()).digest() != hashlib.sha256(dst.read_bytes()).digest():
raise RuntimeError("copy verification failed")
print("applied" if args.apply else "dry-run")
Keluaran awal yang diharapkan:
copy note.txt
dry-run
Alat memilih berkas biasa dengan pola *.txt pada folder sumber langsung, mengurutkannya, dan menampilkan nama yang akan disalin. Dalam kondisi awal ini, default dry run tidak membuat copy-demo/out atau berkas keluaran. Jika folder sumber belum ada, parser melaporkan bahwa persiapan diperlukan.
Periksa nama sumber dan path keluaran yang direncanakan. Pratinjau dapat berhenti jika target yang sama sudah ada; ia bukan mode yang menjamin selalu menyelesaikan tampilan semua rencana meskipun ada benturan.
Terapkan salinan dan periksa byte hasil
Sesudah meninjau daftar yang sesuai, jalankan:
python safe_copy.py --apply
Penerapan pertama pada fixture bersih menampilkan copy note.txt lalu applied, dan membuat copy-demo/out/note.txt. Pembukaan target dengan mode xb menolak pembuatan jika berkas bernama sama sudah ada. Sumber dibuka sebagai byte dan disalin melalui shutil.copyfileobj.
Sesudah kedua objek berkas ditutup, hash SHA-256 sumber dan hasil dibandingkan. Ini memeriksa kesamaan byte file kecil contoh. Lihat copyfileobj Python dan hashlib untuk operasi yang digunakan.
- Pastikan persiapan menghasilkan sumber dan dry run tidak membuat folder keluaran.
- Jalankan penerapan pertama, buka sumber serta hasil, dan pastikan keduanya memuat teks contoh yang sama.
- Jalankan penerapan sekali lagi.
FileExistsErrorharus menghentikan proses tanpa mengganti hasil lama atau menghapus sumber. - Untuk mengulang dari kondisi bersih, gunakan folder latihan baru atau identifikasi hasil percobaan dengan teliti sebelum membersihkannya. Jangan menonaktifkan pemeriksaan benturan hanya untuk memaksa pengulangan.
Jika tidak ada berkas yang cocok, proses dapat menampilkan applied tanpa membuat folder keluaran. Label itu hanya menunjukkan jalur opsi yang dipilih, bukan jumlah berkas yang berhasil disalin. Periksa daftar dan hasil aktual.
Pahami batas sebelum memperluas alat
Pemeriksaan benturan dilakukan di dalam loop. Jika ada beberapa sumber dan benturan baru ditemukan pada berkas belakangan, berkas sebelumnya mungkin sudah disalin. Alat ini bukan transaksi seluruh batch dan tidak otomatis membatalkan salinan yang selesai. Untuk kebutuhan semua-atau-tidak-sama-sekali, rancangan perlu tahap pemeriksaan menyeluruh dan kebijakan penerapan serta pemulihan yang sesuai.
Kegagalan saat penyalinan juga dapat meninggalkan target sebagian. Periksa path absolut dan isinya sebelum menentukan apakah target itu boleh dibersihkan untuk percobaan ulang. Gunakan penanganan pengecualian yang menjaga penyebab tetap terlihat, bukan mengabaikan kegagalan dan menganggap semua sumber selesai.
Penyalinan menggunakan aliran, tetapi perhitungan hash contoh membaca seluruh file kecil ke memori. Untuk file besar, hitung hash per blok. Kesamaan isi juga belum memeriksa metadata, pemilik, izin akses, atau seluruh aturan symbolic link. Penyalinan isi bukan cadangan lengkap semua sifat file.
Pengecualian entri symbolic link tidak melindungi dari setiap perubahan path serentak oleh pengguna yang tidak dipercaya, termasuk penggantian direktori induk. Contoh ditujukan pada folder latihan terkendali. Sebelum menambah pemindahan, penggantian nama, atau penghapusan, rancang inventaris target, cadangan, dan pemulihan secara terpisah. Saat membersihkan, pastikan path final berada dalam copy-demo percobaan yang dimaksud dan hanya pilih hasil yang telah diidentifikasi.




