Linux系統管理之Python生態工具、文本處理和系統管理
一、Python生態工具
一、Python內置小工具
1、秒級啟動一個下載服務器
Python 內置了一個下載服務器就能夠顯著提升效率了 。 例如, 你的同事要讓你傳的文件位於某一個目錄下,那麽,你可以進入這個目 錄 , 然後執行下面的命令啟動一個下載服務器 :
Python2實現: python -m SimpleHTTPServer Python3實現: 在 Python 3 中,由於對系統庫進行了重新整理,因此,使用方式會有不同: python -m http.server
執行上面的命令就會在當前目錄下啟動一個文件下載服務器, 默認打開 8000 端口 。 完成以後,只需要將 IP 和端口告訴同事,讓同事自己去操作即可,非常方便高效 。
效果如下:
註意:如果當前目錄下存在一個名為 index .html 的文件,則 默認顯示該文件的內容 。 如果當前目錄下不存在這樣一個文件,則默認顯示當前目錄下的文件列表。
2、字符串轉換為JSON
需求:在工作過程中,我們的系統會調用底層服務的 API。底層服務的 API一般都以 JSON 的格式返回,為了便於問題追蹤,我們會將 API 返回的 JSON 轉換為字符串記錄到日誌文件中。 當需要分析問題時,就需要將日誌文件中的 JSON 字符串拿出來進行分析 。這個時候,需要將一個 JSON 字符串轉換為 JSON 對象,以提高日誌的可讀性 。
解決:
# echo ‘{" job":" developer"," name":" lmx"," s ex":"male " }‘ |python -m json.tool { " job": " developer", " name": " lmx", " s ex": "male" }
使用命令行解釋器解析JSON 串非常方便,而且,為了便於閱讀,該工具還會自動將轉換的結果進行對齊和格式化。 如下所示:
# echo ‘{"signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes-Soulmate": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "8760h" } } } }‘|python -m json.tool { "signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes-Soulmate": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } }
二、pip的高級用法
1、pip常用子命令
1、pip的子命令對照表
2、系統安裝pip
easy_install pip
3、查找安裝包
pip search flask
4、安裝特定的安裝包版本
pip install flask==0.8
5、刪除/卸載安裝包
pip uninstall Werkzeug
6、查看安裝包的信息(-f顯示安裝包所在的目錄)
pip show flask
7、查看安裝包的依賴是否完整
pip check flask
8、列出已安裝的包(有兩種方法)
pip list (-o 查詢可升級的包)
pip freeze
9、導出系統已安裝的安裝包列表到 requirements 文件
pip freeze > requirements.txt
10、從requirements文件安裝需要的包
pip install -r requirements.txt
11、使用pip命令補全
pip completion --bash >~/.profile
$ source ~/.profile
12、下載包不安裝
pip install <包名> -d <目錄> 或 pip install -d <目錄> -r requirements.txt
13、打包
pip wheel <包名>
14、升級指定的包(有兩種方式)
pip install -U <包名>
或:pip install <包名> --upgrade
15、升級pip
pip install -U pip
2、加速pip安裝的技巧
使用Python時間比較長的話,會發現 Python 安裝的一個問題,即 pypi.python.org 不是特別穩定,有時候會很慢,甚至處於完全不可用的狀態。
1、使用豆瓣或者阿裏雲的源加速軟件安裝
我們國內目前有多個pypi鏡像,推薦使用豆瓣的鏡像源或阿裏的鏡像源。
國內的鏡像源地址: 阿裏:https://mirrors.aliyun.com/pypi/simple 豆瓣:http://pypi.douban.com/simple 中國科學技術大學:http://pypi.mirrors.ustc.edu.cn/simple/
單次使用安裝源:如果要使用第三方的源,只需要在安裝時,通過 pip 命令的-i 選項指定鏡像源即可。如下所示:(包名放置前後均可)
pip install -i http://pypi.douban.com/simple flask
指定全局安裝源
在unix和macos,配置文件為:$HOME/.pip/pip.conf
在windows上,配置文件為:%HOME%\pip\pip.ini
[global] timeout = 6000 index-url = http://pypi.douban.com/simple文件內容
2、將軟件下載到本地部署
如果需要對大批量的服務器安裝軟件包,並且安裝包比較多或者比較大,則可以考慮將軟件包下載到本地,然後從本地安裝。 這對於使用腳本部署大量的服務器非常有用 ,此外,對於服務器無法連接外網的情況,也可以使用這種方法。如下所示:
下載到本地
pip install download=‘pwd‘ -r requirements.txt
本地安裝
pip install --no-index -f file.//‘pwd‘ -r requirements.txt
使用這種方式,只需要下載一次,就可以多處安裝,不用擔心網絡不穩定的問題 。 例如,我們通過這種方式下載 Flask 到當前目錄下,則 Flask 的 依賴 click 、itsdangerous 、 Jinja2、Markup Safe 和 Werkzeug 也會被下載到本地。
pip install --download=‘pwd‘ flask
三、Python編輯器
1、Linux環境:編輯Python的vim插件
vim是一個功能強大、高度可定制的文本編輯器,與Emacs一起成為Linux下最著名的文本編輯器。
vim最強大的地方在於快速移動和高度可定制,所以使用vim編寫Python代碼時,只需要進行簡單的定制就能夠大幅提高編碼效率。
1、一鍵執行
一鍵執行功能不是一個插件,而是自定義的vim配置。如果我們寫的Python代碼是一些較為簡單的腳本,那麽,這個一鍵執行的功能會非常實用。將下面的配置放在vim的配置文件當中,編寫完Python代碼以後,按F5就實現了一鍵執行功能。該功能最實用的是編寫單元測試,寫完測試不用退出vim,立即執行就能看到結果,非常方便。
配置連接地址:https://blog.csdn.net/u010871058/article/details/54253774
vimPython配置版:https://www.cnblogs.com/cjy15639731813/p/5886158.html
2、代碼補全插件snipmate
代碼補全能夠顯著減少敲鍵的次數,將我們從瑣碎的語法中解放出來。毫不誇張地說,代碼補全插件能夠幫我們寫一半的代碼。例如,使用snipmate插件,輸入ifmain後按tab鍵將會自動生成下面的代碼:
3、語法檢查插件 Syntastic
Syntastic是一款強大的語法檢查插件,當我們保存源文件時,它就會執行。執行完以後,會提示我們哪些代碼存在語法錯誤,哪些代碼不符合編碼規範,並給出具體的提示信息。例如,Python代碼風格默認設置為PEP8,即使我們不太了解PEP8的代碼風格,只要使用了Syntastic插件,並根據它給出的提示進行修改,就能夠寫出完全符合PEP8風格的代碼。
4、編程提示插件jedi-vim
jedi-vim是基於jedi的自動補全插件,與snipmate不同的是,該插件更加智能。jedi-vim更貼切的稱呼是“編程提示”,而不是代碼補全插件。需要註意的是,使用jedi-vim插件前需要在電腦中安裝jedi。這個插件是Python的標配。
jedi是一個自動補全和靜態分析的Python庫,直接使用pip安裝即可:
pip install jedi
使用jedi-vim編寫Python的代碼效果圖
2、Windows環境:Python編輯器PyCharm介紹
PyCharm是由JetBrains打造的一款功能強大的Python IDE 也是目前最流行的 Python IDE。JetBrains是捷克一家軟件開發公司,該公司最為人熟知的產品是一款名為 IntelliJ IDEA的Java IDE 。IntelliJ IDEA是Eclipse最大的競爭對手,並且,不少資深的軟件工程師 都認為,IntelliJ IDEA 比 Eclipse更加智能、更加好用。可以看到,JetBrains 算得上是一家歷史悠久的開發編輯器的公司,正因為該公司在編輯器領域的多年沈澱、對編輯器的易用性有深刻的理解和獨到的見解,使得PyCharm一經推出就受到了Python工程師的廣泛關註 。
PyCharm是一款很現代的編輯器,幾乎包含了所有現代編輯器應有的功能:
- 代碼補全;
- 代碼高亮;
- 項目管理;
- 智能提示;
- 代碼風格檢查;
- 集成單元測試;
- 集成版本控制工具;
- 圖形界面調試;
- 方便的重構工具;
- 快捷鍵支持;
- 大量的插件。
四、Python代碼規範檢查
Python 官方給出的編碼規範 PEP 8 ,然後介紹檢查代碼是否符合規範的工具 pycodestyle ,以及可以將代碼風格格式化成 PEP 8 的 autopep8 。
1、PEP 8編碼規範
1、PEP 8編碼規範介紹
Python代碼給人的第一印象就是顏值高、簡潔優美、可讀性強。這一方面是因為Python語言自身的優秀設計,如通過統一的縮進來表示代碼塊,通過減少多余的符號使得代碼更加簡潔;另一方面是因為Python代碼有著較為統一的編碼風格。
PEP 8本身只是編碼風格方面的建議,並不強制工程師遵循。但是,由於該建議被Python工程師廣泛接納,因此,它已經成為了事實上的標準。
PEP8編碼規範詳細地給出了Python編碼的指導,包括對齊規則、包的導人順序、空格與註釋、命名習慣和異常處理等Python編程的方方面面,並且提供了詳細的示例。
2、PEP 8編碼規範指導手冊
官網手冊:https://www.python.org/dev/peps/pep-0008/
中文手冊:https://blog.csdn.net/ratsniper/article/details/78954852
3、註意事項
在Python2中,相對導入又可以分為顯式相對導入和隱式相對導入,而在Python3中,已經棄用了隱式相對導入。
Python中支持相對導人和絕對導人,推薦使用絕對導人。因為絕對導人可讀性更好,也不容易出錨,即使出錯也會給出更加詳細的錯誤信息。
2、使用pycodestype檢查代碼規範
Python官方的代碼規範稱為PEP8,這個檢查代碼風格的命令行工具叫陰間,很容易引起困惑。因此,Python之父提議將pep8這個命令行工具重命名為 pycodestyle。
1、安裝相關的插件
pip install peps
pip install pycodestyle
2、對一個或多個文件運行 pycodestyle
方式一: pycodestyle --first optparse.py 方式二: pep8 optparse.py
3、顯示不規範的源代碼
pycodestyle --show-source --show-pep8 test.py
3、使用autopep8將代碼格式化
1、autopep8簡介
autopep8是一個開源的命令行工具,它能夠將Python代碼自動格式化為PEP8風格。autopep8使用pycodestyle工具來決定代碼中的哪部分需要被格式化,這能夠修復大部分pycodestyle工具中報告的排版問題。autopep8本身也是一個Python語言編寫的工具。
2、安裝autopep8
pip install autopep8
3、autopep8的使用
autopep8 --in-place optparse.py
--in-place參數類似於sed的-i參數,直接將修改結果保存到源文件中。若不加--in-place則只將結果輸出到控制臺,不修改源文件。
autopep8 還存在--aggressive選項,使用該選項會執行更多實質性的更改,可以多次使用以達到更佳的效果
五、Python工作環境管理
Python2和Python3之間存在著較大的差異,並且,由於各種原因導致了Python2和Python3的長期共存。在實際工作過程中,我們可能會同時用到Python2和Python3,因此,需要經常在Python2和Python3之間進行來回切換。
這涉及到兩個工具:pyenv和virtualenv。pyenv用於管理不同的Python版本,virtualenv用於管理不同的工作環境。
部署應用:https://blog.csdn.net/lyintong/article/details/68491351
1、註意pyenv和virtualenv的區別
pyenv用以管理不同的Python版本,例如,你的系統工作時使用Python2.7.13,學習時使用Python3.6.0。
virtualenv用以隔離項目的工作環境,例如,項目A和項目B都是使用Python2.7.13,但是,項目A需要使用Flask0.8版本,項目B需要使用Flask0.9版本。
我們只要組合pyenv和virtualenv這兩個工具,就能夠構造Python和第三方庫的任意版本組合,擁有很好的靈活性,也避免了項目之間的相互幹擾。
virtualenv本身是一個獨立的工具,用戶可以不使用pyenv而單獨使用virtualenv。但是,如果你使用了pyenv,就需要安裝pyenv-virtualenv插件,而不是通過virtualenv軟件使用virtualenv的功能。
2、使用pyenv管理不同的Python版本
1、pyenv簡介
pyenv是一個Python版本管理工具,它能夠進行全局的Python版本切換,也可以為單個項目提供對應的Python版本。使用pyenv以後,可以在服務器上安裝多個不同的Python版本,也可以安裝不同的Python實現。不同Python版本之間的切換也非常簡單。
2、pyenv的安裝
1、選擇安裝到$HOME/.pyenv目錄 git clone https://github.com/yyuu/pyenv.git ~/.pyenv
2、配置環境變量 echo ‘export PYENV_ROOT="$HOME/.pyenv"‘ >> /etc/profile echo ‘export PATH="$PYENV_ROOT/bin:$PATH"‘ >>/etc/profile
3、使環境變量立即生效 source /etc/profile
3、pyenv的使用
1、查看一下有哪些版本的python 可以安裝 pyenv install --list 2、安裝指定版本的Python pyenv install -v 2.7.1 pyenv install -v 3.6.1 3、卸載指定版本的Python pyenv uninstall 2.7.1 4、查看所有的Python版本 pyenv versions 5、查看當前操作的Python版本 pyenv version
註意:
- system 代表當前系統的python 版本
- 全局環境下的python不會自動加載到pyenv下,一定要自己再安裝一次各個版本的python
3、使用virtualenv管理不同的項目
1、virtualenv簡介
virtualenv 本身是一個獨立的項目,用以隔離不同項目的工作環境 。
用戶需求:用戶希望在項目A中使用Flask0.8這個版本,與此同時,又想在項目B中使用Flask0.9這個版本。如果我們全局安裝Flask,必然無法滿足用戶的需求。這個時候,我們就可以使用virtualenv。
我們只要組合pyenv和virtualenv這兩個工具,就能夠構造Python和第三方庫的任意版本組合,擁有很好的靈活性,也避免了項目之間的相互幹擾。
virtualenv本身是一個獨立的工具,用戶可以不使用pyenv而單獨使用virtualenv。但是,如果你使用了pyenv,就需要安裝pyenv-virtualenv插件,而不是通過virtualenv軟件使用virtualenv的功能。
2、pyenv-virualenv的安裝
git clone https://github.com/yyuu/pyenv-virtualenv.git echo ‘eval "$( pyenv virtualenv - init -) "‘>>/etc/profile source /etc/profile
3、pyenv-virualenv的使用
有了pyenv-virtualenv以後,我們可以為同一個Python解釋器,創建多個不同的工作環境。例如,我們新建兩個工作環境:
pyenv virtualenv 2.7.13 first_project
pyenv virtualenv 2.7.13 second_project
使用virtualenvs指明了查看工作環境
pyenv virtualenvs
進入/退出/刪除virtualenv虛擬環境
1、activate進入一個工作環境 pyenv activate first_project 2、deactivate退出一個工作環境 pyenv deactivate first_project
3、virtualenv-delete刪除虛擬環境
pyenv virtualenv-delete first_project
二、文本處理
一、Jinja2
中文文檔:https://www.kancloud.cn/manual/jinja2/70423
1、模板介紹
模板在Python的web開發中廣泛使用,它能夠有效地將業務邏輯和頁面邏輯分離,使得工程師編寫出可讀性更好、更加容易理解和維護的代碼。
web開發是最需要使用模板的地方,但是,並不是唯一可以使用模板的地方。模板使用範圍比大多數工程師接觸的都要廣泛,因為模板適合所有基於文本的格式,如HTML,XML,CSV,LaTeX等。
使用模板能夠編寫出可讀性更好、更容易理解和維護的代碼,並且使用範圍非常廣泛,因此怎麽使用模板主要取決於工程師的想象力和創造力。例如,本書第十章即將介紹的Ansible就使用Jinja2來管理配置文件。
作為工程師,我們也可以使用Jinja2管理工作中的配置文件。一旦學會使用模板管理配置文件,就可以擺脫無數瑣碎的文本替換工作。
Python自帶的模板功能非常有限,例如無法在模板中使用控制語句和表達式,不支持繼承和重用等操作。這對於web開發來說遠遠不夠,因此,出現了第三方的模板系統。目前市面上有非常多的模板系統,其中最知名的是Jinja2和Mako。
2、Jinja2語法入門
Jinja2是Flask作者開發的一個模板系統,起初是仿Django模板的一個模板引擎,為Flask提供模板支持。但是,由於其靈活、快速和安全等優點被廣泛使用。
1、Jinja2模板引擎之所以使用廣泛,是因為它具有以下優點:
- 相對於Template,Jinja2更加靈活,它提供了控制結構、表達式和繼承等,工程師可以在模板中做更多的事情;
- 相對於Mako,Jinja2提供了僅有的控制結構,不允許在模板中編寫太多的業務邏輯,避免了工程師亂用行為;
- 相對於Django模板,Jinja2的性能更好;
- Jinja2模板的可讀性很好。
2、Jinja2是Flask的一個依賴,如果已經安裝了Flask,Jinja2也會隨之安裝。當然,也可以單獨安裝Jinja2
pip install jinja2
3、語法塊
在jinja2中,存在三種語法:
1 控制結構 {% %} 2 變量取值 {{ }} 3 註釋 {# #}
範例
{% block body %} <ul> {% for user in users %} <li><a href="{{ user.url }}">{{ user.username }}</a></li> {% endfor %} </ul> {% endblock %}
4、變量
Jinja2模板中使用的 {{ }} 語法表示一個變量,它是一種特殊的占位符,告訴模板引擎這個位置的值在渲染模板時獲取。Jinja2識別所有的Python數據類型,甚至是一些復雜的類型,如列表、字典和對象等
5、Jinja2的過濾器
變量可以通過“過濾器”進行修改,過濾器可以理解為是Jinja2裏面的內置函數和字符串處理函數。
Jinja2比較常用的過濾器:
在Jinja2中,變量可以通過“過濾器”修改,過濾器與變量用管道(|)分割。多個過濾器可以鏈式調用,前一個過濾器的輸出會作為後一個過濾器的輸入。如下所示:
6、Jinja2的控制結構
Jinja2中的if語句類似於Python中的if語句,但是,需要使用endif語句作為條件判斷的結束。我們可以使用if語句判斷一個變量是否定義,是否為空,是否為真值。與Python中的if語句一樣,也可以使用elif和else構建多個分支,如下所示:
7、Jinja的for循環
Jinja2中的for語句可用於叠代Python的數據類型,包括列表、元組和字典。在Jinja2中不存在while循環,這也符合了Jinja2的“提供僅有的控制結構,不允許在模板中編寫太多的業務邏輯,避免了工程師亂用行為”設計原則。
除了基本的for循環使用以外,Jinja2還提供了一些特殊的變量,我們不用定義就可以直接使用這些變量。列出了Jinja2循環中可以直接使用的特殊變量。
6、Jinja2的宏
Jinja2宏的簡單使用:http://makaidong.com/printN/3301_768547.html
Jinja2宏問題解決:https://blog.csdn.net/qq_34062683/article/details/78234695
宏類似於語言中的函數,用於將行為抽象成可重復調用的代碼塊。與函數一樣。宏分為定義與調用兩個階段。
在宏的定義中,使用macro關鍵字定義一個宏,input是宏的名稱。它有三個參數,分別是name,type和value,其中type和value參數有默認值。可以看到宏的定義與Python的函數定義非常相似,此外,它與Jinja2中的for循環和if語句一樣,不需要使用復合語句的冒號,使用endmacro結束宏的定義。
下面是宏的調用,與函數調用類似:
import jinja2 rules={ "name":"xxxxxxx", "rules":[ { "alert": "z1", "expr": "up == 0", "duration": "1m", "enable": 1, "labels":{"labels1":"label1","label2":"label2"}, "annotations":{"annotations":"annotations"} }, { "alert": "z2", "expr": "up == 0", "duration": "1m", "enable": 1, "labels":{"label1":"label1","label2":"label2"}, "annotations":{"annotation1":"annotation1", "annotation2":"annotation2"} } ], "desc":"group DESC NEW1" } RENDER_RULES_TEMPLATE = """groups: - name: {{ rules.name }} rules: {%- for alert in rules.rules %} - alert: {{ alert.alert }} expr: {{ alert.expr}} for: {{ alert.duration }} labels: {%- for item in alert.labels %} {{ item }}: {{ alert.labels[item] }} {%- endfor %} annotations: {%- for item in alert.annotations %} {{ item }}: {{ alert.annotations[item] }} {%- endfor %} {% endfor %} """ result = jinja2.Template(source=RENDER_RULES_TEMPLATE).render(rules=rules) with open(‘result.yml‘,‘w‘) as fp: fp.write(result)jinja2宏應用:創建yaml文件
9、Jinja2的集成和super函數
若只是使用Jinja2進行配置文件管理,基本用不到Jinja2的繼承功能。若使用Jinja2進行web開發。
Jinja2中最強大的部分就是模板繼承。模塊繼承允許你構建一個包含站點共同元素的基本模板“骨架”,並定義子模塊可以覆蓋的塊。
三、Linux系統管理
一、文件讀寫
1、Python內置的open函數
文件打開的模式
操作示例
f = open(‘data1.txt‘,‘w‘,encoding=‘utf-8‘) # print(f.read()) f.write(‘hello, world‘) f.close()
2、避免文件句柄泄露:使用try....finally
使用try....finally
try: f = open(‘data.txt‘,encoding=‘utf-8‘) print(f.read()) finally: f.close()
對於文件打開、處理、再關閉的邏輯,使用上下文管理器的代碼(使用with語句):
with open(‘data.txt‘,encoding=‘utf-8‘) as f: print(f.read())
3、常見的文件操作函數
Python的文件對象有多種類型的函數,如刷新緩存的flush函數,獲取文件位置的tell函數,改變文件讀取偏移量的seek函數。
1、Python中讀的相關函數
- read :讀取文件中的所有內容 ;
- readline : 一次讀取一行;
- readlines :將文件內容存到一個列表中,列表中的每一行對應於文件中的一行 。
read 函數和 readlines 函數都是一次就將所有內容讀入到內存中 。處理的是小文件還是可以的,若大文件,占用內存太多,甚至會出現Out-Of-Memory錯誤。所以避免這樣操作。
2、Python中寫的相關函數
- write:寫字符串到文件中,並返回寫入的字符數;
- writelines:寫一個字符串列表到文件中。
在Python中,除了使用文件對象的write函數和writelines函數向文件寫入數據以外,也可以使用print函數將輸出結果輸出到文件中。print函數比write和writelines函數更加靈活。
# 導入功能模塊
from __future__ import print_function with open(‘data.txt‘,‘w‘) as f: print(1, 2, ‘hello world‘, sep=",", file=f)
4、Python的文件是一個可叠代對象
Python的for循環不但可以遍歷如字符串、列表、元組這樣的可叠代徐磊,還可以使用叠代器協議遍歷可叠代對象。Python的文件對象實現了叠代器協議。
with open(‘data.txt‘) as inf: for line in inf: print(line.upper())
5、案例:將文件中所有單詞的首字母變成大寫
1、實現方式一:with語句
with open(‘data.txt‘) as inf, open(‘out.txt‘, ‘w‘) as outf: for line in inf: outf.write(" ".join([word.capitalize() for word in line.split()])) outf.write("\n")
2、實現方式二:print函數來簡化輸出語句
from __future__ import print_function with open(‘data.txt‘) as inf, open(‘out_print.txt‘, ‘w‘) as outf: for line in inf: print(*[word.capitalize() for word in line.split()], file=outf)
二、文件與文件路徑管理
1、知識點連接
詳情見Python的os模塊:http://www.cnblogs.com/happy-king/p/7704487.html#_label4
2、案例:打印最常用的10條Linux命令
當我們在Shell中輸入命令並執行時,有非常多的快捷鍵可以提高我們的工作效率。例如,我們可以在Bash中使用ctrl+r搜索曾經執行過的Linux命令,之所以可以使用ctrl+r搜索曾經執行過的Linux命令是因為Bash跟蹤用戶之前輸入過的命令,並將其保存在~./bash_history文件中。我們可以使用history命令或者直接讀取~./bash_history文件的內容來查看命令歷史。
搜索歷史命令的快捷鍵:ctrl+r
統計每條命令的出現次數,然後找出出現次數最多的10條命令。
1 import os 2 from collections import Counter 3 4 c = Counter() 5 with open(os.path.expanduser(‘~/.bash_history‘)) as f: 6 for line in f: 7 cmd = line.strip().split() 8 if cmd: 9 c[cmd[0]] += 1 10 11 12 CmdCount=c.most_common(10) 13 print(CmdCount)Python3實現
三、文件內容管理
系統管理員在管理服務器時,可能會有這樣的疑問:
- 兩個目錄中的文件到底有什麽差別
- 系統中有多少重復文件存在
- 如何找到並刪除系統中的重復文件
1、目錄和文件比較:filecmp模塊
1、cmp函數
filecmp模塊最簡單的函數是cmp函數,該函數用來比較兩個文件是否相同,如果文件相同,返回True,否則返回False。
2、cmpfiles函數
cmpfiles函數用來同時比較兩個不同目錄下的多個文件,並且返回一個三元組,分別包含相同的文件、不同的文件和無法比較的文件。
cmpfiles函數用來同時比較兩個目錄下的文件,也可以使用該函數比較兩個目錄。但是,在比較兩個目錄時需要通過參數指定所有可能的文件,顯然比較繁瑣。
3、dircmp函數
調用dircmp函數以後會返回一個dircmp類的對象,該對象保存了諸多屬性,工程師可以通過讀取這些屬性的方式獲取目錄之間的差異。
filecmp 模塊的 dircmp 函數僅僅比較目錄下面的文件和子目錄 ,但是,並不會遞歸比較子目錄的內容 。 對於目錄, dircmp 函數也僅僅是比較函數的名稱 ,不會去比較子目錄裏面的內容。
2、使用Python管理壓縮包
shutil模塊:http://www.cnblogs.com/happy-king/p/7704487.html#_label6
Linux系統管理之Python生態工具、文本處理和系統管理