Faragiri
فارسی

زبان را انتخاب کنید ۲

همهٔ زبان‌ها

آموزش خودکارسازی با پایتون پایتون

یک اسکریپت مرتب‌سازی که اول فقط می‌گوید چه می‌خواهد بکند. همان یک پرچم، تفاوت میان یک اشتباه قابل برگشت و یک پوشه به‌هم‌ریخته است.

۴بخش
۳دقیقه خواندن
۴عمق

پیش از اولین تغییر نام

اسکریپت چه چیزی را بررسی کرده و چه چیزی را نه

هر بله پایین یک سطر از اسکریپت است. سطر نامعلوم همان است که تصمیم می‌گیرد اجرا بی‌خطر باشد، و هیچ اسکریپتی نمی‌تواند جوابش را بدهد.

  1. بلههمه فایل‌ها پیدا شدندپسوند با حروف کوچک مقایسه شد و نه با الگوبله
  2. بلهدو فایل یک نام جدید نمی‌خواهندشمارش نام‌های یکتا در برابر تعداد فایل‌هابله
  3. بلههنوز چیزی نوشته نشدهنقشه چاپ شد و دیسک دست‌نخورده استبله
  4. بلهابزار بیرونی موفق بودبا check=True، خروج غیرصفر خطا می‌دهدبله
  5. بررسی نشدهنام‌های جدید همان‌اند که می‌خواستیدفقط شما می‌دانید که این تبدیل درست استبررسی نشده
  6. خیرنسخه اصلی قابل بازیابی استهیچ‌جا کپی ساخته نشد، و تغییر نام پشتیبان نیستخیر

حالت سوم دلیل وجود این نمودار است. سطر پنجم را کسی نگاه نکرده، و تنها چیزی که آن را به بله تبدیل می‌کند اسکریپتی است که نقشه‌اش تایید شده باشد.

هر اسکریپتی که فایل‌ها را عوض می‌کند باید دو حالت داشته باشد و حالت پیش‌فرضش باید حالت بی‌خطر باشد. یعنی اول نقشه را چاپ می‌کند و تنها با یک پرچم صریح واقعا دست به کار می‌شود.

خروجی حالت نمایش، روی پوشه‌ای با سه فایل:

  • would rename 'IMG_0041 copy.JPG' -> 'img_0041.jpg'
  • would rename 'IMG_0042.JPG' -> 'img_0042.jpg'

فایل سوم یک فایل متنی بود و اصلا در فهرست نیامد، چون Path("scans").rglob("*.JPG") فقط دو تصویر را پیدا می‌کند. همین‌جا یک دام هست که روی مک و ویندوز پنهان می‌ماند و روی سرور لینوکسی بیرون می‌زند: الگوی *.JPG به بزرگی و کوچکی حرف حساس است، پس فایلی با پسوند کوچک اصلا دیده نمی‌شود. راه امن، مقایسه p.suffix.lower() است و نه اتکا به الگو.

سه بررسی که پیش از اولین نوشتن لازم‌اند

اول، اینکه دو فایل نام جدید یکسان نگیرند. شمردن تعداد نام‌های جدید یکتا در برابر تعداد فایل‌ها این را در یک سطر می‌گوید، و اگر برابر نباشند، اجرای واقعی یکی از فایل‌ها را روی دیگری می‌نویسد و برگشتی هم ندارد.

دوم، اینکه مقصد از قبل وجود نداشته باشد. Path.rename روی سیستم‌های شبه‌یونیکس فایل مقصد را بی‌صدا بازنویسی می‌کند و هیچ خطایی نمی‌دهد. سوم، اینکه تغییر نام پشتیبان نیست: هیچ‌کدام از این سطرها کپی نمی‌سازند، و اگر نتیجه آن چیزی نبود که می‌خواستید، راه برگشتی وجود ندارد مگر آنکه خودتان ساخته باشید.

وقتی یک ابزار بیرونی صدا زده می‌شود

خیلی از این اسکریپت‌ها در جایی یک برنامه دیگر را اجرا می‌کنند. با subprocess.run حتما check=True بدهید، وگرنه خروج با کد غیرصفر بی‌صدا رد می‌شود و اسکریپت با فرض موفقیت ادامه می‌دهد. و آرگومان‌ها را به‌شکل فهرست بدهید و نه یک رشته با shell=True، چون نام فایلی که فاصله یا نویسه ویژه دارد آن رشته را به چیز دیگری تبدیل می‌کند.

خطاهایی که این اسکریپت‌ها می‌دهند تقریبا همیشه از داده می‌آیند و نه از منطق، پس ثبت کردنشان همان چیزی است که اجرای بعدی را قابل تشخیص می‌کند: چه چیزی ثبت شود تا خرابی بعدی قابل تشخیص باشد.

جایی که کار گیر می‌کند، نام فایل فارسی است

پوشه‌های واقعی در ایران پر از نام فایل فارسی‌اند و همان‌ها سه مسئله می‌سازند که در هیچ آموزشی نیستند. یکی اینکه نام‌ها گاهی با «ی» و «ک» عربی ثبت شده‌اند و از دید رشته با نسخه فارسی‌شان برابر نیستند، پس جست‌وجو پیدایشان نمی‌کند. دوم فاصله مجازی، که دیده نمی‌شود و در مقایسه هست. سوم ترتیب، که همان مسئله چند روش نام‌دار، و اینکه زبان شما یکی را انتخاب کرده است. کاری که این را جمع می‌کند یک تابع کوچک است که پیش از هر مقایسه، یای عربی U+064A را به یای فارسی U+06CC و کاف عربی U+0643 را به کاف فارسی U+06A9 تبدیل کند و فاصله مجازی را بردارد؛ همان یک تابع، بیشتر این پوشه‌ها را قابل پردازش می‌کند.

ابزار، و سالی که این حرف درست است

در سال ۲۰۲۶ ماژول pathlib در کتابخانه استاندارد و رایگان است و جای os.path با رشته‌های چسبانده‌شده را گرفته؛ تفاوت عملی‌اش این است که پسوند و نام و پوشه هرکدام یک صفت‌اند و نه نتیجه یک برش رشته‌ای. برای صفحه‌گسترده، csv در همان کتابخانه برای فایل‌های ساده کافی است و فقط برای فایل‌های اکسل واقعی به یک بسته بیرونی نیاز دارید. هیچ‌کدام از دستورهای این صفحه به شبکه نیاز ندارند.

پرسش بعدی این است که وقتی این اسکریپت باید هر روز خودش اجرا شود، کجا بنشیند و چطور خبر بدهد که کار کرده، که فهمیدن خرابی، پیش از آنکه کاربر بگوید است. و اگر بسته‌ای لازم شد که همراه پایتون نیست، نصب کتابخانه، و جدا نگه داشتن پروژه‌ها از هم مرحله پیش از آن است.

کنار این

بالای این