用Python处理文件的实用姿势
這是“Python1024-自動化辦公”的第一篇。
在Python1024的基礎篇中,我們已經介紹過文件管理和文本文件的讀寫:
《編程的第一個應用,往往都從文件讀寫開始》
在路徑處理方面,Python3.6版本后,建議采用pathlib,它采用面向對象封裝接口,使用起來比os.path更人性化。
在學習后續章節前,有必要先介紹幾個基本的概念,方便后續的理解。
1、常見文件格式
文本文件其實是一種特殊的二進制文件,它約定了以字符格式的讀取方式,字符符合ASCII或UNICODE等編碼標準。因為文本文件太通用、太特殊(字符形式)了,我們把它單獨列出對待。
其他二進制文件則隨應用的不同,有各式各樣的讀寫規則。比如:
- PDF(Portable Document Format)文件,定義了一種獨立于應用程序、硬件、操作系統的方式呈現文檔的文件格式。它內部包含了大量類型的子元素,通過索引的方式嵌入在不同的位置。只有符合其規范的軟件,才能讀取,甚至修改PDF文件。PDF文件格式標準由Adobe定義:參考官網。
- 微軟2007版本之后的Office文件,比如docx、pptx、xlsx,屬于OpenXML文件格式。它是由微軟開發的基于XML和ZIP壓縮技術的文件規范,并于2008年正式成為國際標準。可以用解壓縮軟件打開這類文件,就能看到其內部結構。目前除了微軟Office軟件,我們也可以通過金山WPS、OpenOffice等軟件打開其文檔。
- 圖像文件的格式非常多,根據壓縮算法不同,會設計不同的文件格式,比如:JPEG、TIFF、RAW、BMP、GIF、PNG。歸根到底,圖像代表的是色彩數據,是整塊的內容,而描述其數據結構的,是文件頭部信息。
- 音頻文件,保存的是聲音信號的數字化,和圖像一樣,文件不同主要源于壓縮算法的不同。我們常見的音頻文件格式如:MP3、WAV、AAC、FLAC等,聲音信號被數字化后保存在數據塊中,同時由文件頭描述數據塊。關鍵信息如采樣率、比特率、聲道數。采樣率是時間相關的概念,即每秒收集多少次聲音樣本信息。
- 視頻文件,保存的是圖像和音頻的合集,即視頻文件可以拆分為視頻和音頻,其中視頻是圖像的合集,每秒鐘有多少張圖像,就是它的FPS幀率,幀率決定了視頻的流暢度。此外,每張圖像的分辨率多大,決定了它的清晰度,比如我們常說的720P代表1280×720的分辨率,1080P就是1920×1080的分辨率,即代表用1920×1080個像素點來表達一張圖片信息。所以,視頻文件尤其大,根據壓縮算法的不同,常見的文件格式如:MP4、MOV、FLV、WMV、WEBM等。
當然,除了上面這些文件格式外,我們還可以定義自己的格式,只要定義的格式,能被對應軟件支持打開和寫入即可。換句話說,如果你定義的文件格式,沒人寫出軟件去支持,那就沒辦法應用。或者,你自己寫了軟件,但大部分人都不知道,或不想用,那它也就喪失了應用價值。在軟件行業向互聯網演進過程中,淘汰了大量的軟件,才誕生出目前相對穩定的互聯網基礎設施。
Youtube上有人做了一個視頻,呈現了90年代到2020年間最受歡迎瀏覽器的更替:視頻地址。
2、文本文件也有分類
文本文件,本質上是用于存儲字符的文件。
所有那些以字符保存的文件格式,其實都是文本文件,只不過文本內容還有額外特定含義。
常見的比如:CSV、HTML、XML、JSON、JS、CSS,還有各種語言的代碼。
2.1 CSV文件
CSV文件常用于保存數據表格,比如:
姓名, 電話, 地址 張三, 18900000001, 上海 李四, 13800000002, 廣州這就是一個典型的CSV文件,我們可以用文本編輯器打開它,也可以用Excel等軟件打開它。如果用Excel軟件打開它,Excel會把英文逗號作為分隔符號,提取單元格內容,我們看到的就是一張表格。
Python同樣也支持這類文件的讀寫,通過csv模塊:
這樣就能讀出CSV文件中的數據:
姓名: 張三 電話: 18900000001 地址: 上海 姓名: 李四 電話: 13800000002 地址: 廣州2.2 XML文件
XML(eXtensible Markup Language)是為了結構化存儲和傳輸數據而生,是一種標記語言。
<?xml version="1.0" encoding="UTF-8"?> <mail><to>World</to><from>程一初</from><title>Hello World</title><body>Welcome to Python1024!</body> </mail>我們可以自定義標記,一種定義就是一種數據格式。在Python中,有三種處理數據的方式:
- DOM(Document Object Model):文檔對象模型,是W3C組織推薦的標準編程接口。它把XML文件映射到內存中,以“樹”的數據結構來操作數據。
- SAX(simple API for XML):事件驅動模型,雖然不是標準,但應用廣泛。它逐行掃描文檔,邊掃邊解析,這樣就不用一下子全裝載到內存了。
- ElementTree:性能介乎于DOM和SAX之間,使用門檻低。
以ElementTree為例:
import pathlib import xml.etree.ElementTree as ETpath = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/001basic') xml_path = path.joinpath('hello.xml') tree = ET.parse(xml_path) root = tree.getroot() # 根節點 print('root_tag:', root.tag) # 根標簽:mail for elem in root:print(f'{elem.tag}: {elem.text}')此外,HTML是XML的一個子集,即HTML是一種特殊的XML,它定義了一整套標簽規范,比如文字、超鏈接、表單等,按照這套規范來呈現HTML的應用就是瀏覽器了。當然,瀏覽器除了支持HTML,還需要支持JS腳本、CSS樣式文件等其他規范。
2.3 JSON文件
相比XML文件格式,JSON文件格式更精簡。同樣的信息可以用更少的字符表示:
{"mail": {"to": "World","from": "程一初","title": "Hello World","body": "Welcome to Python1024!"} }少了對稱標記以及<>符號,JSON需要占用更少標記數據,所以它更常被用于互聯網應用的數據傳輸。Python也內置了處理模塊json:
import pathlib import jsonpath = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/001basic') json_path = path.joinpath('hello.json') with open(json_path, 'r') as f:data = json.loads(f.read()) print(f'root_tag: {list(data.keys())[0]}') for k, v in data['mail'].items():print(f'{k}: {v}')2.4 代碼文件
代碼文件,比如Python代碼文件,也是一種文本文件。所以,有一些靜態代碼檢測工具,如pylint、pep8、flake8等,可以讀取代碼文件后檢查編寫質量。甚至,你可以編寫程序自動生成代碼,在自動化測試中用的比較多。
代碼文件的讀取和其他文本文件一樣,都可以用open()函數打開,但是要解析代碼文件,就必須用“語法樹”來解析,它也提供了對應的ast模塊。比如我們寫一個簡單的Python代碼文件,包含一個注釋塊,以及一行代碼:
然后用語法樹解析它:
import pathlib import astpath = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/001basic') py_path = path.joinpath('hello.py') with open(py_path, 'r') as f:node = ast.parse(f.read()) # 獲取文檔注釋 print(ast.get_docstring(node))class MyVisitor(ast.NodeVisitor):# 定義一個遍歷代碼節點的類# 按需重定義generic_visit函數def generic_visit(self, node):print(node)super(MyVisitor, self).generic_visit(node) v = MyVisitor() v.visit(node)會得到這樣的結果:
Author: 程一初 <_ast.Module object at 0x118e4e890> <_ast.Expr object at 0x118ce1b50> <_ast.Str object at 0x118ce1f90> <_ast.Expr object at 0x118ce1d90> <_ast.Call object at 0x118ce1ad0> <_ast.Name object at 0x118ce1b10> <_ast.Load object at 0x103ed39d0> <_ast.Str object at 0x118eb3ed0>第一行為注釋文檔,剩下8行為ast內部對象,包括模塊、表達式、字符串、函數名、調用等。這里只是舉個例子,說明代碼文件也是一種特殊的文本文件。平時應用中,我們幾乎不會這么去讀寫代碼文件,而是直接用Python解釋器來執行代碼。
總結
了解什么是文件,就能明白每個文件都有自己的規范,想要處理某類文件,就得先找到符合規范的應用,或者模塊。找到模塊后,就可以通過結構化的代碼來批量處理了。
常見的自動化處理無非就這幾種:
- 批量文件處理,比如某個文件夾下的所有文件統一重命名;
- 根據提前設定的規則,自動分類處理文件,比如按文件后綴調用不同程序處理;
- 組成流水線:把重復的工作提煉出標準,把每一步程序化后再組裝起來。
Python的魅力,就是能把所有重復的工作,按模塊組織起來,形成流水線,一個人發揮N個人的效率。
更多內容請關注公眾號:只差一個程序員了。
建個學習群,有興趣可以添加交流,前100名免費。
總結
以上是生活随笔為你收集整理的用Python处理文件的实用姿势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动布局+百分比布局+em+rem+动态
- 下一篇: 家政APP开发解决方案