日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 编写自动化工具

發(fā)布時間:2023/12/20 python 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 编写自动化工具 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引言:

在開發(fā)過程中,我們經(jīng)常需要編寫一些自動化的工具,例如:

  • Windows 下的 BATCH (批處理)
  • Linux 下的 Shell 等

但是假如我們要做跨平臺的開發(fā),根據(jù)每個平臺去開發(fā)一套功能相同的自動化腳本顯然不是最好的選擇,選擇跨平臺通用的腳本是更好的選擇,Python 就是常用來編寫自動化工具的跨平臺腳本語言。

Python 環(huán)境安裝:

1.資源下載:

直接到 Python 官網(wǎng) 下載安裝包,有兩個分支:2.x 和 3.x,兩者有著巨大的差別,當然現(xiàn)在比較流行的還是 2.7.x 系列,這里我直接下載此系列的最新版本:python-2.7.13.msi 。

2.安裝步驟:

過程十分簡單,雙擊打開安裝包,一直 Next 直到安裝完成,記得要記錄一下其安裝目錄,后面配置系統(tǒng)環(huán)境時要用到。

3.環(huán)境配置:

打開 計算機 -> 屬性 -> 高級系統(tǒng)設置 -> 環(huán)境變量... ,然后再 系統(tǒng)變量 中新建一項,設置參數(shù)如下:

變量名:PYTHON_HOME 變量值:D:\Develope\Python2.7

然后編輯系統(tǒng)變量中的 Path 變量的參數(shù),在變量值最后加上 ;%PYTHON_HOME%;,然后保存編輯內(nèi)容。然后,打開命令行窗口查詢是否配置成功:

C:\Users\hasee-pc>python --version Python 2.7.13

以上說明環(huán)境變量的配置已完成。

4.運行 Python:

運行 Python 代碼塊的方式有兩種,一種是直接在命令行窗口輸入 Python 指令進入交互式編程窗口,然后直接輸入代碼,鍵盤 Enter 執(zhí)行結果,如下:

C:\Users\hasee-pc>python Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit ( Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> print "hi,linsh" hi,linsh

也可以創(chuàng)建一個 .py 腳本,編輯好腳本內(nèi)容,例如:

# test.py print "hi,linsh"

然后,在命令行定位到腳本所在目錄,執(zhí)行該腳本,以下兩種執(zhí)行方式都可以:

D:\Develope\PythonProjects>python test.py hi,linsh D:\Develope\PythonProjects>test.py hi,linsh

# 號用于注釋單行,多行注釋通常使用三引號 ''' 或 """ 開始和結束。


Python 基礎語法:

這里不會贅述太多細節(jié)性的語法,只簡述一些必要的基礎語法,更詳細的可以參考 【 Python 語言參考 】:

1.特殊標識符:

  • 跟其他編程語言一樣,Python 中所有標識符可以包含:英文、數(shù)字以及下劃線(_),但不能以數(shù)字開頭;
  • 以下劃線開頭的表示特殊含義:
    • 單下劃線 _ 開頭表示不能直接被外部類直接訪問的類屬性,,需要通過類提供的接口才能進行訪問,例如:_foo;
    • 雙下劃線 __ 開頭表示類的私有成員,就像很多語言中的 private 權限關鍵字的作用,例如:__foo;
    • 以雙下劃線開頭和結尾代表 Python 中特殊方法專用的標識,例如 __init__() 代表類的構造函數(shù)。

2.縮進和代碼塊:

Python 與其他語言最大的不同,在于它不使用 {} 或者像 Lua 那樣的關鍵字來包裹一個代碼塊以管理類、函數(shù)或邏輯判斷,而是直接通過 縮進 來管理模塊。

縮進的空白 數(shù)量(鍵盤空格鍵次數(shù))是可變的,但是所有代碼塊語句必須包含相同的縮進空白數(shù)量。例如:

if True:print "True" else:print "False"

通常將編程工具的一次 Tab 鍵的距離設為 4 個空格 距離,作為一級縮進的空白數(shù)。

3.數(shù)據(jù)類型和變量:

Python 有 5 種標準的數(shù)據(jù)類型:

Numbers(數(shù)字) String(字符串) List(列表) Tuple(元組) Dictionary(字典)

但是,在定義變量時,不需要聲明變量的類型,變量在使用前需要先進行賦值,此時解釋器才能根據(jù)賦值的類型為此變量分配創(chuàng)建內(nèi)存空間并創(chuàng)建此變量,只是聲明但不賦值的變量是不能使用的。例如:

number = 2 # 整型 percent = 100.0 # 浮點型 name = "linsh" # 字符串

此外,還可以同時對多個變量進行賦值:

number,percent,name = 2,100.0,"linsh"

4.函數(shù):

函數(shù)的使用一方面是為了提高代碼的重用性,另一方面又可以增強代碼的可讀性和模塊化,下面是 Python 定義函數(shù)的格式:

def funcName(param1,param2,...):...

以關鍵字 def 來聲明一個函數(shù),緊跟著是函數(shù)名(函數(shù)標識符),然后是 () 包圍起來的傳入?yún)?shù)表,可以是 0 個參數(shù),也可以是多個參數(shù),然后用 : 號開始函數(shù)內(nèi)容的開始。例如:

# test.py # # -*- coding: utf-8 -*-# 方法定義 def TestFunc1():print "test1"def TestFunc2(num):print "test2: num = ",num #str 和 int 類型拼接# 方法調用 TestFunc1() TestFunc2(66)

執(zhí)行結果:

D:\Develope\PythonProjects>test.py test1 test2: num = 66

編寫工具:

1.設計目標:

首先說一下我要工具的功能:

遍歷某個目錄下包括其下子目錄中所有指定的后綴文件,然后為這些文件的頭部插入指定的字符串。

2.使用場景:

設計這樣的工具起因是我最近在將之前 CSDN 中的博客搬運到自己的 Hexo 博客空間上,了解的應該知道,假如都是 Markdown 編寫的話,搬運的時候只需要在文件頭部加上如下的一串額外的內(nèi)容:

--- title: 博客標題 date: 博客創(chuàng)建時間(例如:2016-09-03 17:15:22) tags: 標簽(如:[Hexo,Next],多個的話用,號隔開) categories: 分類(如:Web) ---
  • 標題 title 直接使用文件名稱去掉 .md 后綴即可;
  • 時間 date 需要通過文件庫獲取文件的創(chuàng)建時間;
  • 標簽 tags 和分類 categories ,由于我的文件會根據(jù)分類放入不同的子目錄下,所以直接獲取當前文件所在目錄的名稱即可。

此外,為了在博客首頁只展示部分內(nèi)容,而不是展開博客的完整內(nèi)容,還需要在博客中恰當?shù)奈恢貌迦脒@個標簽:<!--more--> ,通常加載第一段內(nèi)容結束的位置。

3.實現(xiàn)代碼:

根據(jù)上面的思路,我們在 source/_posts 目錄下創(chuàng)建一個工具腳本,起名為 SuitFileToHexo.py ,然后依次完成以下步驟:

  • 指定 Linux 環(huán)境下 Python 解釋器目錄,并指定編碼方式:

    #!/usr/bin/env python # -*- coding: utf-8 -*-
  • 引入的模塊:

    在腳本開始的地方,最先需要做的事情就是把需要用到的模塊都先引入進來,大致分析一下我們這個功能需要用到的模塊:

    import os.path,time
  • 遍歷當前目錄下所有 .md 文件列表:

    這就需要使用到 Python 的文件目錄操作模塊 os.path ,使用 os.listdir 獲取目錄列表,然后通過 os.path.splitext 分割文件名稱和后綴名,從而篩選合格的文件:

    # 獲取指定目錄指定后綴名的文件列表 def getFileList(path,endStr):'''獲取指定目錄下,指定后綴的文件列表'''r_list = []f_list = os.listdir(path) #獲取目錄列表for i in f_list:# 分離文件名和后綴名,過濾掉工具腳本file_endStr = os.path.splitext(i)[1]# 判斷是否是目錄if os.path.isdir(i):f_list1 = os.listdir(path+'/'+i)for j in f_list1:# 過濾出指定后綴 endStr 后綴的文件if os.path.splitext(j)[1] == endStr:# 為了清晰目錄把文件所在目錄也標識出來r_list.append(i+'/'+j)# print j.decode("string_escape")elif file_endStr == endStr:r_list.append(i)return r_list

這里發(fā)現(xiàn)了一個問題,就是在 os.path.isdir(i) 在 2.7.11 的版本莫名其妙地返回 false,需要做如下修改才能正常:

if file_endStr == '':i = os.path.join(path, i) #=================〉這一行很必要# print i# 判斷是否是目錄if os.path.isdir(i):...
  • 獲取文件的創(chuàng)建時間:

    需要使用到 os.time 模塊的功能:

    # 獲取文件創(chuàng)建時間 def get_FileCreateTime(filePath):t = os.path.getctime(filePath)return TimeStampToTime(t)# 把時間戳轉化為時間: 1479264792 to 2016-11-16 10:53:12''' def TimeStampToTime(timestamp):timeStruct = time.localtime(timestamp)return time.strftime('%Y-%m-%d %H:%M:%S',timeStruct)
  • 獲取博客標題:

    其實就是從目錄字符串中截掉后綴名,再截掉最后一個 / 之前的內(nèi)容即可得到博客名稱:

    # 獲取目錄中去掉前面路徑和后綴的文件名字 def getFileSimpleName(filePath):name = ''# 先去掉后綴name = os.path.splitext(filePath)[0]# 獲取最后一個斜杠位置index = name.rfind('/')# 找不到則返回 -1if index != -1:# 截取斜杠后面到結尾內(nèi)容name = name[index+1:]# print namereturn name
  • 獲取文件所在的目錄名稱作為頁簽值:

    與獲取博客名稱思路略有相似,獲取最后一個斜杠位置,截掉斜杠之后的內(nèi)容,在獲取一個最后一個斜杠位置,假如有則截取斜杠之后的內(nèi)容即是文件所在目錄的名稱:

    # 獲得分類文件目錄名稱 def getTypeNameByPath(filePath):fileTag = ''# 獲取最后一個斜杠位置index = filePath.rfind('/')# 找不到則返回 -1if index != -1:# 截取斜杠后面到結尾內(nèi)容fileTag = filePath[:index]# 截掉前面部分index = fileTag.rfind('/')if index != -1:fileTag = fileTag[index+1:]# print fileTagreturn fileTag
  • 向文件中插入內(nèi)容:

    調用以上方法即可分別得到我們想要的信息:

    # 指定目錄 path = './' # 得到文件列表 files = getFileList(path,'.md') for i in files:print 'title: '+getFileSimpleName((i.decode("string_escape")))print 'date: '+get_FileCreateTime((path+i.decode("string_escape")))print 'tags: ['+getTypeNameByPath((i.decode("string_escape")))+']'

    接下來要做的就是把這些內(nèi)容按照格式插入到文件中去,當然插入之前需要先檢查文件中是否已經(jīng)插入過類似的內(nèi)容了,可以簡單地通過檢查開頭 40 個字符串中是否包含這個字符串來判別:

‘’’—
title: ‘’’

關于展示分隔符 ``<!--more-->`` 插入的位置,大致邏輯是:第一個標題后面,而且剛好插入在第二個標題之前即可,而使用 Markdown 語法撰寫的博客標題使用 ``#`` 來表示的,最終的插入方法如下:```python # 向文件中插入指定數(shù)據(jù) def addHeadToFile(filePath,title,date,tags):file = open(filePath,"r")content = file.read()index = content[:40].find('''--- title:''')# 添加if index == -1:print 'Undadded'addContent = '''--- title: '''+title+''' date: '''+date+''' tags: ['''+tags+'''] categories: '''+tags+''' --- '''# 檢測是否插入部分顯示標簽content = addContent + contentindex = content.find('''<!--more--> ''')if index == -1:# 獲取第一段的位置index = content.find('''### ''')if index != -1:#print "first ### pos = ",index# 下一個標題位置(在第二個標題之前插入即可)pos = content[index:].find('''#''',1)if pos != -1:index += pos#print "second enter pos = ",indexcontent = content[:index]+''' <!--more--> '''+content[index:]file = open(filePath,"w")file.write(content)else:#print 'file head had added'# 記得要關閉文件file.close()

最后完整的調用過程:

# 指定目錄 path = './' # 得到文件列表 files = getFileList(path,'.md') # 聲明一些全局變量 title = '' date = '' tags = '' for i in files:title = getFileSimpleName(i.decode("string_escape"))date = get_FileCreateTime(path+i.decode("string_escape"))tags = getTypeNameByPath(i.decode("string_escape"))print 'title: '+titleprint 'date: '+dateprint 'tags: ['+tags+']'addHeadToFile(path+i.decode("string_escape"),title,date,tags)

?

其他:

如果你跟我一樣出現(xiàn)了打印中文文件名變成諸如: “BATCH\xc5\xfa\xb4\xa6\xc0\xed\xbc\xf2\xbc\xc7.md” 這種格式的話,可以參考:Linux 下Python2.7解決list打印中文字符問題


參考資料:

  • Python注釋
  • Python 基礎語法
  • Python 函數(shù)
  • Python 入門指南
  • python 獲取文件大小,創(chuàng)建時間和訪問時間
  • python插入內(nèi)容到指定文件的位置
  • os.path.isdir() 判斷文件夾卻返回false

微信公眾號「何樂不為呢」,一個碼農(nóng)的技術筆記和嘮叨。

總結

以上是生活随笔為你收集整理的Python 编写自动化工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。