前言
我們從網上爬取數據,最后一步會考慮如何存儲數據。如果數據量不大,往往不會選擇存儲到數據庫,而是選擇存儲到文件中,例如文本文件、CSV 文件、xls 文件等。因為文件具備攜帶方便、查閱直觀。
Python 作為膠水語言,搞定這些當然不在話下。但在寫數據過程中,經常因數據源中帶有中文漢字而報錯。最讓人頭皮發麻的編碼問題。
我先說下編碼相關的知識。編碼方式有很多種:UTF-8, GBK, ASCII 等。
ASCII 碼是美國在上個世紀 60 年代制定的一套字符編碼。主要是規范英語字符和二進制位之間的關系。英語詞匯組成簡單,由 26 個字母構成。使用一個字節就能表示一個字母符號。外加各種符號,使用 128 個字符就滿足編碼要求。
不同國家有不同語言文字。同時,文字組成部分的數量相比英語字母要多很多。根據不完全統計,漢字的數量大約將近 10 萬個,日常所使用的漢字有 3000 個。顯然,ASCII 編碼無法滿足需求。所以漢字采用 GBK 編碼,使用兩個字節表示一個漢字。簡體中文的編碼方式是 GBK2312。
那 UTF-8 又是什么編碼?這要先說 Unicode 了。Unicode 目的是為了統一各種編碼。因為各國都各自的編碼方式。如果使用一種編碼編碼,使用另一種編碼解碼。這會造成出現亂碼的情況。但 Unicode 只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。UTF-8 就是在互聯網上使用最廣的一種 Unicode 的實現方式。
因此,如果我們要寫數據到文件中,最好指定編碼形式為 UTF-8。
Python 標準庫中,有個名為 csv 的庫,專門處理 csv 的讀寫操作。
Python csv模塊封裝了常用的功能,使用的簡單例子如下:
# 讀取csv文件import csvwith open('some.csv', 'rb') as f: # 采用b的方式處理可以省去很多問題reader = csv.reader(f)for row in reader:# do something with row, such as row[0],row[1]import csvwith open('some.csv', 'wb') as f: # 采用b的方式處理可以省去很多問題writer = csv.writer(f)writer.writerows(someiterable)
具體使用實例如下:
import csvimport codecs# codecs 是自然語言編碼轉換模塊fileName = 'PythonBook.csv'# 指定編碼為 utf-8, 避免寫 csv 文件出現中文亂碼with codecs.open(fileName, 'w', 'utf-8') as csvfile: # 指定 csv 文件的頭部顯示項 filednames = ['書名', '作者'] writer = csv.DictWriter(csvfile, fieldnames=filednames) books = [] book = { 'title': '笑傲江湖', 'author': '金庸', } books.append(book) writer.writeheader() for book in books: try: writer.writerow({'書名':book['title'], '作者':book['author']}) except UnicodeEncodeError: print("編碼錯誤, 該數據無法寫到文件中, 直接忽略該數據")
新聞熱點
疑難解答