1. 程式人生 > >Linux系統管理之Python生態工具、文本處理和系統管理

Linux系統管理之Python生態工具、文本處理和系統管理

相對 print 重復調用 示例 快捷 python編程 expr markup htm

一、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 對象,以提高日誌的可讀性 。

  解決:

這個需求十分常見,以至於使用搜索引擎搜索 叮SON”,處於搜索結果的第一項便是“在線 JSON 格式化工具” 。 除了打開瀏覽器,使用在線 JSON 格式化工具以外,我們也可以使用命令行終端的 Python 解釋器來解析 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是一款很現代的編輯器,幾乎包含了所有現代編輯器應有的功能:

  1. 代碼補全;
  2. 代碼高亮;
  3. 項目管理;
  4. 智能提示;
  5. 代碼風格檢查;
  6. 集成單元測試;
  7. 集成版本控制工具;
  8. 圖形界面調試;
  9. 方便的重構工具;
  10. 快捷鍵支持;
  11. 大量的插件。

四、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

  註意:

  1. system 代表當前系統的python 版本
  2. 全局環境下的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中讀的相關函數
  1. read :讀取文件中的所有內容 ;
  2. readline : 一次讀取一行;
  3. readlines :將文件內容存到一個列表中,列表中的每一行對應於文件中的一行 。

  read 函數和 readlines 函數都是一次就將所有內容讀入到內存中 。處理的是小文件還是可以的,若大文件,占用內存太多,甚至會出現Out-Of-Memory錯誤。所以避免這樣操作。

    2、Python中寫的相關函數
  1. write:寫字符串到文件中,並返回寫入的字符數;
  2. 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. 兩個目錄中的文件到底有什麽差別
  2. 系統中有多少重復文件存在
  3. 如何找到並刪除系統中的重復文件

  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生態工具、文本處理和系統管理