大多數(shù)作業(yè)具有可以自動(dòng)執(zhí)行的重復(fù)性任務(wù),從而節(jié)省了一些寶貴的時(shí)間。這使自動(dòng)化成為一項(xiàng)關(guān)鍵技能。一小撮熟練的自動(dòng)化工程師和領(lǐng)域?qū)<乙苍S可以自動(dòng)化整個(gè)團(tuán)隊(duì)中許多最繁瑣的任務(wù)。那么python如何實(shí)現(xiàn)日常工作自動(dòng)化?在本文中,我們將探討使用Python(一種功能強(qiáng)大且易于學(xué)習(xí)的編程語言)的工作流自動(dòng)化的基礎(chǔ)。我們將使用Python編寫一個(gè)簡單而有用的自動(dòng)化小腳本,該腳本將清理給定的文件夾并將每個(gè)文件放入相應(yīng)的文件夾中。
我們的目標(biāo)不是在一開始就編寫完美的代碼或創(chuàng)建理想的體系結(jié)構(gòu)。我們也不會(huì)建立任何“非法”的東西。相反,我們將研究如何創(chuàng)建一個(gè)腳本,該腳本會(huì)自動(dòng)清理給定的文件夾及其所有文件。
一、自動(dòng)化領(lǐng)域和起點(diǎn)
自動(dòng)化技術(shù)適用于大多數(shù)領(lǐng)域。對于初學(xué)者來說,它有助于完成諸如從一堆文檔中提取電子郵件地址之類的任務(wù),以便您可以進(jìn)行電子郵件爆炸。或更復(fù)雜的方法,例如優(yōu)化大型公司內(nèi)部的工作流程和流程。
當(dāng)然,從小型的個(gè)人腳本到替代實(shí)際人員的大型自動(dòng)化基礎(chǔ)架構(gòu)涉及學(xué)習(xí)和改進(jìn)的過程。因此,讓我們看看您可以從何處開始旅程。
簡單自動(dòng)化
簡單的自動(dòng)化實(shí)現(xiàn)了快速直接的切入點(diǎn)。這可以涵蓋小的獨(dú)立過程,例如項(xiàng)目清理和目錄內(nèi)文件的重組,也可以包括工作流的某些部分,例如自動(dòng)調(diào)整已保存文件的大小。
公共API自動(dòng)化
公共API自動(dòng)化是最常見的自動(dòng)化形式,因?yàn)槿缃裎覀兛梢允褂脤PI的HTTP請求來訪問大多數(shù)功能。例如,如果您想在家中自動(dòng)為自制的智能花園澆水。
為此,您想檢查當(dāng)天的天氣,看看是否需要澆水或是否有雨來。
API逆向工程
在實(shí)際的漫游器中,基于API逆向工程的自動(dòng)化更為常見,在下面的“道德注意事項(xiàng)”部分中,該圖表的“ Bot Imposter”部分中也是如此。
通過對API進(jìn)行反向工程,我們可以了解應(yīng)用程序的用戶流程。一個(gè)例子是登錄在線瀏覽器游戲。
通過了解登錄和身份驗(yàn)證過程,我們可以使用自己的腳本來復(fù)制該行為。然后,即使他們自己不提供應(yīng)用程序,我們也可以創(chuàng)建自己的接口來使用該應(yīng)用程序。
無論您要采用哪種方法,請始終考慮它是否合法。
您不想惹麻煩,對嗎?
二、道德考量
GitHub上的某個(gè)人曾經(jīng)與我聯(lián)系并告訴我:
“喜歡和參與是數(shù)字貨幣,您正在貶值它們。”
這讓我感到困惑,并讓我質(zhì)疑我為此目的而構(gòu)建的工具。
這些互動(dòng)和參與可以自動(dòng)化并“偽造”的事實(shí)越來越多,這導(dǎo)致了社交媒體系統(tǒng)的扭曲和破壞。
如果人們不使用漫游器和其他互動(dòng)系統(tǒng),那么產(chǎn)生有價(jià)值和優(yōu)質(zhì)內(nèi)容的人將對其他用戶和廣告公司不可見。
我的一個(gè)朋友想出了以下但丁與但丁的“地獄九圈”的聯(lián)系,在每一步中,隨著成為社會(huì)影響者的步伐越來越近,您將越來越不了解整個(gè)系統(tǒng)的實(shí)際破壞力。
我想在這里與您分享這件事,因?yàn)槲艺J(rèn)為這是我與InstaPy積極與網(wǎng)紅合作時(shí)親眼所見的非常準(zhǔn)確的代表。
等級(jí)1:凌波-如果您;
等級(jí)2:調(diào)情 -當(dāng)您手動(dòng)喜歡并關(guān)注盡可能多的人時(shí),請他們跟著您回去/喜歡您的帖子;
等級(jí)3:陰謀 -當(dāng)您加入電報(bào)組喜歡和評(píng)論10張照片,因此接下來的10個(gè)人將喜歡和評(píng)論您的照片;
等級(jí)4:不忠 -當(dāng)您使用低成本的虛擬助手代表您喜歡和關(guān)注時(shí);
等級(jí)5:欲望-當(dāng)您使用機(jī)器人給予喜歡,但沒有得到任何回報(bào)(但您不為此付費(fèi)(例如,Chrome擴(kuò)展程序));
級(jí)別6:濫交-當(dāng)您使用機(jī)器人給予50多個(gè)喜歡得到50多個(gè)喜歡的人,但您無需為此付費(fèi)-例如,Chrome擴(kuò)展程序;
等級(jí)7:貪婪或極端貪婪 -當(dāng)您使用漫游器在200-700張照片之間點(diǎn)贊/關(guān)注/評(píng)論時(shí),忽略了被禁止的機(jī)會(huì);
等級(jí)8:賣淫 -當(dāng)您支付未知的第三者服務(wù)進(jìn)行自動(dòng)對等時(shí)喜歡/關(guān)注您,但他們使用您的帳戶喜歡/關(guān)注;
第9級(jí):欺詐/異端 -當(dāng)您購買關(guān)注者和喜歡并嘗試將自己賣給有影響力的品牌時(shí)。
社交媒體上的惡意攻擊程度如此之高,以至于如果您不進(jìn)行機(jī)器人操作,那么您將被困在Limbo 1級(jí),相對于同齡人而言,追隨者的成長率和參與度都不高。
在經(jīng)濟(jì)學(xué)理論上,這被稱為囚徒困境和零和博弈。如果我不機(jī)器人,而你又機(jī)器人,你贏了。如果您不是機(jī)器人,而我是機(jī)器人,我會(huì)贏。如果沒有機(jī)器人,那么所有人都會(huì)贏。但是,由于沒有人人都不要機(jī)器人,所以沒有人能贏。
注:永遠(yuǎn)不要忘記整個(gè)工具對社交媒體的影響。
我們希望避免處理道德問題,而仍在此處從事自動(dòng)化項(xiàng)目。這就是為什么我們將創(chuàng)建一個(gè)簡單的目錄清理腳本來幫助您整理凌亂文件夾的原因。
三、創(chuàng)建目錄清理腳本
現(xiàn)在,我們要看一個(gè)非常簡單的腳本。通過基于文件擴(kuò)展名將這些文件移動(dòng)到相應(yīng)的文件夾中,它會(huì)自動(dòng)清理給定目錄。
因此,我們要做的就是:
1.設(shè)置參數(shù)解析器
由于我們正在使用操作系統(tǒng)功能(如移動(dòng)文件),因此需要導(dǎo)入os庫。除此之外,我們還希望使用戶可以控制要清理的文件夾。我們將argparse為此使用庫。
import os
import argparse
導(dǎo)入兩個(gè)庫之后,我們首先設(shè)置參數(shù)解析器。確保為每個(gè)添加的參數(shù)提供描述和幫助文本,以在用戶鍵入內(nèi)容時(shí)為用戶提供有價(jià)值的幫助--help。
我們的論點(diǎn)將命名為--path。名稱前面的雙破折號(hào)告訴庫這是一個(gè)可選參數(shù)。默認(rèn)情況下,我們要使用當(dāng)前目錄,因此將默認(rèn)值設(shè)置為"."。
parser = argparse.ArgumentParser(
description="Clean up directory and put files into according folders."
)
parser.add_argument(
"--path",
type=str,
default=".",
help="Directory path of the to be cleaned directory",
)
# parse the arguments given by the user and extract the path
args = parser.parse_args()
path = args.path
print(f"Cleaning up directory {path}")
這樣就完成了參數(shù)解析部分–它非常簡單易讀,對吧?
讓我們執(zhí)行腳本并檢查錯(cuò)誤。
python directory_clean.py --path ./test
=> Cleaning up directory ./test
執(zhí)行后,我們可以看到目錄名稱已完美打印到控制臺(tái)。
現(xiàn)在讓我們使用該os庫來獲取給定路徑的文件。
2. 從文件夾中獲取文件列表
通過使用該os.listdir(path)方法并為其提供有效路徑,我們獲得了該目錄內(nèi)所有文件和文件夾的列表。
在列出文件夾中的所有元素之后,我們不想在文件夾和文件夾之間進(jìn)行區(qū)分,因?yàn)槲覀儾幌肭謇砦募A,而只清理文件。
在這種情況下,我們使用Python列表推導(dǎo)來遍歷所有元素,如果它們滿足作為文件或文件夾的給定要求,則將它們放到新列表中。
# get all files from given directory
dir_content = os.listdir(path)
# create a relative path from the path to the file and the document name
path_dir_content = [os.path.join(path, doc) for doc in dir_content]
# filter our directory content into a documents and folders list
docs = [doc for doc in path_dir_content if os.path.isfile(doc)]
folders = [folder for folder in path_dir_content if os.path.isdir(folder)]
# counter to keep track of amount of moved files
# and list of already created folders to avoid multiple creations
moved = 0
created_folders = []
print(f"Cleaning up {len(docs)} of {len(dir_content)} elements.")
與往常一樣,讓我們確保我們的用戶得到反饋。因此,添加一條打印語句,以向用戶指示要移動(dòng)多少文件。
python directory_clean.py --path ./test
=> Cleaning up directory ./test
=> Cleaning up 60 of 60 elements.
重新執(zhí)行python腳本后,我們現(xiàn)在可以看到/test我創(chuàng)建的文件夾包含60個(gè)將被移動(dòng)的文件。
3.為每個(gè)文件擴(kuò)展名創(chuàng)建一個(gè)文件夾
現(xiàn)在,下一步也是更重要的一步是為每個(gè)文件擴(kuò)展名創(chuàng)建文件夾。為此,我們要瀏覽所有過濾的文件,如果它們的擴(kuò)展名沒有文件夾,請創(chuàng)建一個(gè)。
該os庫可為我們提供更好的功能,例如拆分給定文檔的文件類型和路徑,提取路徑本身和文檔名稱。
# go through all files and move them into according folders
for doc in docs:
# separte name from file extension
full_doc_path, filetype = os.path.splitext(doc)
doc_path = os.path.dirname(full_doc_path)
doc_name = os.path.basename(full_doc_path)
print(filetype)
print(full_doc_path)
print(doc_path)
print(doc_name)
break
上面代碼末尾的break語句可確保如果目錄中包含數(shù)十個(gè)文件,我們的終端也不會(huì)被發(fā)送垃圾郵件。
設(shè)置好之后,讓我們執(zhí)行腳本以查看類似于以下內(nèi)容的輸出:
python directory_clean.py --path ./test
=> ...
=> ./test/test17
=> ./test
=> test17
現(xiàn)在我們可以看到上面的實(shí)現(xiàn)分離了文件類型,然后從完整路徑中提取了部分。
由于我們現(xiàn)在具有文件類型,因此我們可以檢查是否存在具有該類型名稱的文件夾。
在此之前,我們要確保跳過一些文件。如果我們使用當(dāng)前目錄"."作為路徑,則需要避免移動(dòng)python腳本本身。一個(gè)簡單的if條件可以解決這個(gè)問題。
除此之外,我們不想移動(dòng)“ 隱藏文件”,因此我們也包括所有以點(diǎn)開頭的文件。.DS_StoremacOS上的文件是隱藏文件的示例。
# skip this file when it is in the directory
if doc_name == "directory_clean" or doc_name.startswith('.'):
continue
# get the subfolder name and create folder if not exist
subfolder_path = os.path.join(path, filetype[1:].lower())
if subfolder_path not in folders:
# create the folder
處理完python腳本和隱藏文件后,我們現(xiàn)在可以繼續(xù)在系統(tǒng)上創(chuàng)建文件夾。
除了檢查之外,如果在讀取目錄內(nèi)容時(shí)文件夾已經(jīng)存在,那么一開始,我們需要一種跟蹤已創(chuàng)建文件夾的方法。這就是我們宣布該created_folders = []名單的原因。它將用作跟蹤文件夾名稱的存儲(chǔ)器。
要?jiǎng)?chuàng)建一個(gè)新文件夾,該os庫提供了一個(gè)名為的方法,該方法os.mkdir(folder_path)采用一個(gè)路徑并在那里創(chuàng)建一個(gè)具有給定名稱的文件夾。
此方法可能會(huì)引發(fā)異常,告訴我們該文件夾已存在。因此,我們還要確保捕獲該錯(cuò)誤。
if subfolder_path not in folders and subfolder_path not in created_folders:
try:
os.mkdir(subfolder_path)
created_folders.append(subfolder_path)
print(f"Folder {subfolder_path} created.")
except FileExistsError as err:
print(f"Folder already exists at {subfolder_path}... {err}")
設(shè)置文件夾創(chuàng)建后,讓我們重新執(zhí)行腳本。
python directory_clean.py --path ./test
=> ...
=> Folder ./test/pdf created.
在第一次執(zhí)行時(shí),我們可以看到一個(gè)日志列表,告訴我們已經(jīng)創(chuàng)建了具有給定類型的文件擴(kuò)展名的文件夾。
4.將每個(gè)文件移到右子文件夾中
現(xiàn)在的最后一步是將文件實(shí)際移到其新的父文件夾中。
使用os操作時(shí)要了解的重要一點(diǎn)是,有時(shí)無法撤消操作。例如,這就是刪除的情況。因此,首先僅注銷執(zhí)行腳本將實(shí)現(xiàn)的行為是有意義的。
這就是為什么該os.rename(...)方法在這里被評(píng)論的原因。
# get the new folder path and move the file
new_doc_path = os.path.join(subfolder_path, doc_name) + filetype
# os.rename(doc, new_doc_path)
moved += 1
print(f"Moved file {doc} to {new_doc_path}")
執(zhí)行完腳本并查看正確的日志記錄之后,我們現(xiàn)在可以在os.rename()方法前刪除注釋哈希,并最終進(jìn)行注釋。
# get the new folder path and move the file
new_doc_path = os.path.join(subfolder_path, doc_name) + filetype
os.rename(doc, new_doc_path)
moved += 1
print(f"Moved file {doc} to {new_doc_path}")
print(f"Renamed {moved} of {len(docs)} files.")
python directory_clean.py --path ./test
=> ...
=> Moved file ./test/test17.pdf to ./test/pdf/test17.pdf
=> ...
=> Renamed 60 of 60 files.
現(xiàn)在,此最終執(zhí)行會(huì)將所有文件移動(dòng)到它們相應(yīng)的文件夾中,并且無需手動(dòng)操作即可很好地清理我們的目錄。
在下一步中,我們現(xiàn)在可以使用上面創(chuàng)建的腳本,例如,安排它在每個(gè)星期一執(zhí)行,以清理我們的Downloads文件夾以獲得更多結(jié)構(gòu)。
以上即是關(guān)于python如何實(shí)現(xiàn)日常工作自動(dòng)化的全部內(nèi)容,想了解更多關(guān)于python的信息,請繼續(xù)關(guān)注中培偉業(yè)吧。