一文詳解8個Python自動化腳本讓你告別重復(fù)勞動
AI的發(fā)展越來越厲害,所以很多人也習(xí)慣把任務(wù)直接丟給AI。但 AI 在處理自動化任務(wù)時有時候還會不穩(wěn)定,有些還要收費。對于需要每天定時運行、處理大量文件或監(jiān)控系統(tǒng)狀態(tài)的任務(wù),依靠 AI 每次生成結(jié)果容易出現(xiàn)幻覺偏差。
AI很好,但其實有時候殺雞沒必要用牛刀。Python 一樣可以完成一些簡單的自動化任務(wù)。
在寫 Python 之前,要確保 Python 的環(huán)境已經(jīng)準(zhǔn)備好。
推薦使用 ServBay 來管理開發(fā)環(huán)境,它支持一鍵安裝 Python 環(huán)境,覆蓋了從半只腳踏進棺材板的 Python 2.7 到Python 3.5 乃至最新的 Python 3.14 版本。而且這些版本可以同時并存,不需要手動去配置環(huán)境變量,也不用擔(dān)心弄亂系統(tǒng)的默認(rèn)配置。裝好就能用,一分鐘就能搞定。

有了穩(wěn)定的環(huán)境,下面分享幾個在實際工作中常用的自動化腳本模式。
自動重試機制:讓網(wǎng)絡(luò)請求更健壯
寫爬蟲或調(diào)用 API 時,網(wǎng)絡(luò)波動是常態(tài)。與其在每個請求處都寫一遍 try-except,不如把重試邏輯封裝起來。專業(yè)的腳本不會因為一次超時就崩潰。
import time
import requests
from requests.exceptions import RequestException
def fetch_with_retry(url, max_retries=3, pause=2):
"""
帶有自動重試機制的GET請求
"""
for attempt in range(max_retries):
try:
# 設(shè)置超時是必須的,防止程序無限掛起
response = requests.get(url, timeout=10)
response.raise_for_status() # 如果狀態(tài)碼不是200,拋出異常
return response
except RequestException as e:
print(f"請求失敗 (嘗試 {attempt + 1}/{max_retries}): {e}")
if attempt == max_retries - 1:
raise # 最后一次嘗試也失敗,拋出異常
time.sleep(pause)
# 使用示例
try:
data = fetch_with_retry("https://api.github.com")
print(f"請求成功,狀態(tài)碼: {data.status_code}")
except RequestException:
print("重試多次后依然失敗,請檢查網(wǎng)絡(luò)或目標(biāo)服務(wù)。")
它將網(wǎng)絡(luò)不穩(wěn)定的偶發(fā)故障在代碼層面消化。最大的好處是防止腳本因為一次微小的網(wǎng)絡(luò)抖動就全盤崩潰,真正實現(xiàn)了“無人值守”運行,特別適合夜間批量任務(wù)。
依據(jù)文件內(nèi)容重命名
有時候文件名沒有及時修改,就不知道這個文件到底是什么了。
但一個個打開看又非?;〞r間,我們就可以寫個腳本,讓它讀取內(nèi)容并重命名。這個邏輯常用于處理發(fā)票、日志或自動生成的報告。
import os
TARGET_DIR = "./reports"
def clean_filename(text):
# 去除文件名中的非法字符
return "".join(c if c.isalnum() else "_" for c in text)[:50]
for filename in os.listdir(TARGET_DIR):
full_path = os.path.join(TARGET_DIR, filename)
# 確保只處理文件
if os.path.isfile(full_path):
try:
with open(full_path, "r", encoding='utf-8') as f:
# 讀取第一行作為新文件名
first_line = f.readline().strip()
if first_line:
new_name = clean_filename(first_line) + ".txt"
new_path = os.path.join(TARGET_DIR, new_name)
# 防止覆蓋已存在的文件
if not os.path.exists(new_path):
os.rename(full_path, new_path)
print(f"重命名: {filename} -> {new_name}")
except Exception as e:
print(f"無法處理文件 {filename}: {e}")
解決了文件名無意義(如 scan_001.txt)的痛點。腳本直接讀取文件核心內(nèi)容來命名,檢索文件時效率很高,不再需要逐個打開確認(rèn)。
清理長期未訪問的僵尸文件
磁盤空間總是莫名其妙變少,多半是因為那些下載后就再沒打開過的臨時文件。這個腳本能清理長期沒有訪問過的文件,它是依據(jù)最后訪問時間來運行。
import os
import time
WATCH_DIR = "/path/to/cleanup"
EXPIRY_DAYS = 180 # 6個月未訪問則刪除
current_time = time.time()
for filename in os.listdir(WATCH_DIR):
filepath = os.path.join(WATCH_DIR, filename)
if os.path.isfile(filepath):
# 獲取最后訪問時間 (atime)
last_access_time = os.path.getatime(filepath)
# 計算時間差
if current_time - last_access_time > (EXPIRY_DAYS * 86400):
try:
os.remove(filepath)
print(f"已刪除陳舊文件: {filename}")
except OSError as e:
print(f"刪除失敗: {e}")
基于“訪問時間”而非“創(chuàng)建時間”判斷,這非常關(guān)鍵,因為它能精準(zhǔn)識別那些真正不再需要的文件。它就像一個隱形的清潔工,防止磁盤空間被無用的臨時數(shù)據(jù)悄悄吃光。
監(jiān)控并查殺高負(fù)載僵尸進程
有些 Python 腳本(尤其是涉及多進程或機器學(xué)習(xí)任務(wù)的)在意外退出后會留下孤兒進程,占用大量 CPU。手動打開活動監(jiān)視器查找太慢,直接用腳本自檢。
import psutil
# 設(shè)定閾值:CPU占用超過80%且進程名為python
CPU_THRESHOLD = 80.0
PROCESS_NAME = "python"
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent']):
try:
# psutil獲取cpu_percent通常需要interval,這里取瞬時值可能需要兩次調(diào)用或結(jié)合實際場景調(diào)整
# 在腳本循環(huán)監(jiān)控中更為有效
if proc.info['name'] and PROCESS_NAME in proc.info['name'].lower():
if proc.info['cpu_percent'] > CPU_THRESHOLD:
print(f"檢測到高負(fù)載僵尸進程 PID: {proc.info['pid']} (CPU: {proc.info['cpu_percent']}%)")
proc.kill()
print("已終止進程。")
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
這是一種主動防御機制。它解決了長時間運行腳本可能導(dǎo)致的內(nèi)存泄漏或死循環(huán)問題,避免了因單個失控進程拖慢整個系統(tǒng),省去了你手動打開活動監(jiān)視器排查的時間。
操作前的后悔藥:自動備份
在對配置文件或關(guān)鍵數(shù)據(jù)進行寫入操作前,備份是必須的。但往往都是忘記了備份。那就把自動化備份交給Python吧。
import shutil
import time
import os
def safe_backup(filepath):
if not os.path.exists(filepath):
print(f"文件不存在: {filepath}")
return
# 生成帶時間戳的備份文件名
timestamp = time.strftime("%Y%m%d_%H%M%S")
backup_path = f"{filepath}.{timestamp}.bak"
try:
shutil.copy2(filepath, backup_path)
print(f"備份已創(chuàng)建: {backup_path}")
except IOError as e:
print(f"備份失敗: {e}")
raise # 備份失敗則應(yīng)該中斷后續(xù)操作
# 使用場景:修改配置前
config_file = "app_config.yaml"
safe_backup(config_file)
# 此處執(zhí)行寫入操作...
執(zhí)執(zhí)行任何破壞性操作(如覆蓋、寫入)前強制留底,這是生產(chǎn)環(huán)境中最基本的安全法則,確保錯誤發(fā)生時能瞬間回滾。
腳本運行結(jié)束后的系統(tǒng)通知
很多腳本一跑就是半小時,你不可能一直盯著控制臺。讓腳本跑完后彈窗通知你,是提升工作體驗的小細(xì)節(jié)。
import platform
import os
def send_notification(title, text):
system_type = platform.system()
if system_type == "Darwin": # macOS
# 使用 AppleScript 調(diào)用通知
cmd = f"""osascript -e 'display notification "{text}" with title "{title}"'"""
os.system(cmd)
elif system_type == "Linux":
# Linux 通常使用 notify-send
cmd = f"""notify-send "{title}" "{text}" """
os.system(cmd)
else:
print(f"通知: [{title}] {text}")
# 模擬長時間任務(wù)
import time
time.sleep(2)
send_notification("任務(wù)完成", "數(shù)據(jù)處理腳本已執(zhí)行完畢。")
開發(fā)者不需要盯著黑底白字的控制臺發(fā)呆,可以將等待腳本結(jié)束的垃圾時間轉(zhuǎn)化為可自由支配的時間,任務(wù)完成了它會主動找你。
輕量級數(shù)據(jù)采集
當(dāng)你需要從網(wǎng)頁上抓取特定字段(如價格、標(biāo)題)并整理成表格時,Python 是最高效的工具。
import requests
from bs4 import BeautifulSoup
import csv
def scrape_data(url, output_file):
# 偽裝 User-Agent 防止被簡單的反爬攔截
headers = {'User-Agent': 'Mozilla/5.0'}
try:
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
# 假設(shè)我們要抓取文章列表中的標(biāo)題和鏈接
articles = soup.find_all('article')
data_rows = []
for article in articles:
title_tag = article.find('h2')
if title_tag and title_tag.a:
title = title_tag.a.text.strip()
link = title_tag.a['href']
data_rows.append([title, link])
# 寫入CSV
with open(output_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['標(biāo)題', '鏈接'])
writer.writerows(data_rows)
print(f"成功抓取 {len(data_rows)} 條數(shù)據(jù)并保存至 {output_file}")
except Exception as e:
print(f"抓取過程中出錯: {e}")
# 示例調(diào)用
# scrape_data("http://example-blog.com", "results.csv")
將復(fù)制粘貼動作轉(zhuǎn)化為結(jié)構(gòu)化數(shù)據(jù)流。相比人工,它能以毫秒級的速度處理成百上千個頁面,且生成的數(shù)據(jù)格式(如 CSV)統(tǒng)一規(guī)整,直接可用。你就說方便不方便。
自動化文件歸類
我不知道你的電腦怎么樣,但我的下載文件夾是最亂的地方。而這個腳本可以根據(jù)文件后綴,自動將文件移動到對應(yīng)的分類文件夾中。不用自己一個個用手拖。
import os
import shutil
from pathlib import Path
SOURCE_DIR = Path("/Users/username/Downloads/MixedData")
DEST_DIR = Path("/Users/username/Documents/Sorted")
def organize_files():
if not SOURCE_DIR.exists():
return
for file_path in SOURCE_DIR.iterdir():
if file_path.is_file():
# 獲取擴展名,例如 .pdf
ext = file_path.suffix.lower()
if ext: # 忽略無后綴文件
# 去掉點號,作為文件夾名,例如 pdf
folder_name = ext[1:].upper() + "_Files"
target_folder = DEST_DIR / folder_name
# 創(chuàng)建目標(biāo)文件夾
target_folder.mkdir(parents=True, exist_ok=True)
# 移動文件
try:
shutil.move(str(file_path), str(target_folder / file_path.name))
print(f"移動: {file_path.name} -> {folder_name}")
except shutil.Error as e:
print(f"移動文件出錯: {e}")
if __name__ == "__main__":
organize_files()
文件也有收納師,還是免費的。它利用文件擴展名這一最基礎(chǔ)的元數(shù)據(jù),瞬間將混亂的下載目錄變得井井有條,極大地減少了人工整理文件的認(rèn)知負(fù)擔(dān)。
總結(jié)
這些腳本并不復(fù)雜,但它們構(gòu)成了自動化工作流的基礎(chǔ)。從環(huán)境搭建開始,使用 ServBay 解決版本共存的痛點,再配合這些穩(wěn)健的代碼邏輯,就可以把大量耗時的重復(fù)勞動交給機器。真正的程序員不是打字最快的人,而是懂得如何讓代碼替自己工作的人。
以上就是一文詳解8個Python自動化腳本讓你告別重復(fù)勞動的詳細(xì)內(nèi)容,更多關(guān)于Python自動化腳本告別重復(fù)勞動的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 基于win32com客戶端實現(xiàn)Excel操作的詳細(xì)過程
這篇文章主要介紹了Python 基于win32com客戶端實現(xiàn)Excel操作的詳細(xì)過程,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
關(guān)于python tushare Tkinter構(gòu)建的簡單股票可視化查詢系統(tǒng)(Beta v0.13)
這篇文章主要介紹了python tushare Tkinter構(gòu)建的簡單股票可視化查詢系統(tǒng)(Beta v0.13),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
基于注解實現(xiàn) SpringBoot 接口防刷的方法
這篇文章主要介紹了基于注解實現(xiàn) SpringBoot 接口防刷的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
使用matplotlib庫實現(xiàn)圖形局部數(shù)據(jù)放大顯示的實踐
本文主要介紹了使用matplotlib庫實現(xiàn)圖形局部數(shù)據(jù)放大顯示的實踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

