最後更新於 2021 年 5 月 14 日
因為上一篇爬小說排行有使用到讀寫CSV檔的部分,所以就再寫一篇關於Python基礎的讀寫文件資料的方法。
逗點分隔(Comma-Separated Values,簡稱 csv)是一種簡單的文字檔格式,以逗號分隔不同欄位的資料,很多軟體在儲存與交換表格資料時都支援這樣的格式。
資料寫入CSV
由於CSV是Python內建模組,所以不需要特別安裝,直接引入即可。
import csv
open()
用於打開CSV文件以進行讀取,默認情況下將使用系統默認編碼將文件解碼為unicode:
# 若存在檔案則開啟CSV檔案;若不存在則新增檔案 # 若不設定newline=''則每行資料會隔一行空白行 csvfile = open('csv_test.csv','w',newline='')
csv.writer(csvfile)
返回一個writer物件,該物件負責將用戶資料轉換為給定文件上的定界符。
writer = csv.writer(csvfile)
單行資料寫入
# 寫入一行資料 writer.writerow(['姓名','年齡','手機'])
多行資料寫入
# 多行資料寫入 data = [('A女士','22','0932156382'),('B先生','32','0931125354')] writer.writerows(data)
關閉 CSV 物件
# 關閉CSV物件 csvfile.close()
註:若出現「partially initialized module ‘csv’ has no attribute ‘writer’ (most likely due to a circular import)」的錯誤提示,請檢查你python檔案的名稱是否為csv,這會導致你開頭import的csv是你正在執行的csv.py檔而不是csv模組。
CSV資料讀取
讀取CSV檔案的函數有reader和DictReader,兩者都是接收一個可反覆運算的物件,傳回一個產生器。reader函數是將一行資料以列表形式傳回;DictReader函數傳回的是一個字典,字典的值是儲存格的值,而字典的鍵則是這個儲存格的標題(首列)。
import csv csvfile = open('csv_test.csv' , 'r') reader = csv.reader(csvfile) # 以字典形式輸出,第一行為字典的鍵 # reader = csv.DictReader(csvfile) rows = [row for row in reader] print(rows)
輸出
[['姓名', '年齡', '電話'], ['A女士', '22', '0932156382'], ['B先生', '32', '0931125354']]
上方程式碼用於取得全部資料,如果要取得某行資料,可以循環全部資料再對每行資料做判斷,判斷是否符合篩選條件:
import csv csvfile = open('csv_test.csv' , 'r') reader = csv.reader(csvfile) for row in reader: if 'A女士' in row: print(row)
輸出
['A女士', '22', '0932156382']
Excel資料的寫入
Python操作的Excel函數庫有xlrd、xlwt、pyExcelerator和openpyxl。其中pyExcelerator只支援2003版本,openpyxl只支援2007版本,xlrd支援Excel任何版本的讀取,xlwt支援Excel任何版本的寫入。
安裝xlrd和xlwt
pip install xlrd pip install xlwt
Excel的寫入相比較CSV複雜,Excel可實現設定資料格式、合併儲存格、設定公式和插入圖片等功能。使用xlwt實現上述功能的程式如下:
import xlwt # 新增一個 Excel檔案 wb = xlwt.Workbook() # 新增一個 sheet ws = wb.add_sheet('Python',cell_overwrite_ok=True) # 定義字型對齊方式物件 alignment = xlwt.Alignment() # 設定水平方向 alignment.horz = xlwt.Alignment.HORZ_CENTER # 設定垂直方向 alignment.vert = xlwt.Alignment.VERT_CENTER # 定義格式物件 style = xlwt.XFStyle() style.alignment = alignment # 合併儲存格write_merge(開始行,結束行,開始列,結束列,內容,格式) ws.write_merge(0,0,0,5,'Python爬蟲',style) # 寫入資料wb.write(行,列,內容) for i in range(2,7): for k in range(5): ws.write(i,k,i+k) # Excel公式xlwt.Formula ws.write(i,5,xlwt.Formula('SUM(A'+str(i+1)+':E'+str(i+1)+')')) # 插入圖片insert_bitmap(img,x,y,x1,y1,scale_x=0.8,scale_y=1) # 圖片格式必為bmp ws.insert_bitmap('Documents\\test.bmp',9,1,2,2,scale_x=0.3,scale_y=0.3) # 儲存檔案 wb.save('file.xls')
註:插入的圖片格式必須為24位元點陣圖(.bmp)。
讀取Excel資料
須由xlrd模組實現,此段代碼將讀取前一節產生的xls檔:
import xlrd wb = xlrd.open_workbook('file.xls') # 取得 sheet 總數 ws_count = wb.nsheets print('Sheets總數:',ws_count) # 透過索引順序取得Sheets # ws = wb.sheets()[0] # ws = wb.sheet_by_index(0) # 透過Sheets名取得Sheets ws = wb.sheet_by_name('Python') # 取得整行的值(以清單回傳內容) row_value = ws.row_values(3) print('第四行資料:',row_value) # 取得整列的值(以清單回傳內容) col_value = ws.col_values(3) print('D列資料:',col_value) # 獲得所有行列 nrows = ws.nrows ncols = ws.ncols print('總行數: ',nrows,', 總列數: ',ncols) # 取得某個儲存格內容cell(行,列) cell_F3 = ws.cell(2,5).value print('F3內容: ',cell_F3) # 使用行列索引取得某個儲存格內容 row_F3 = ws.row(2)[5].value col_F3 = ws.col(5)[2].value print('F3內容: ',row_F3,'F3內容: ',col_F3)
xlrd documentation、xlwt documentation
Word資料的寫入
Python讀寫word需要用到python-docx函數庫支援,使用pip安裝:
pip install python-docx
以下段程式碼實作Word資料寫入:
from docx import Document from docx.shared import Inches # 建立物件 document = Document() # 增加標題 其中0代表標題類型 document.add_heading('Python',0) p = document.add_paragraph('Python - ') p.runs[0].bold = True p.add_run('資料儲存 - ').bold = True p.add_run('Word - ') p.add_run('儲存實例.').italic = True document.add_paragraph('樣式 - 明顯參考',style='Intense Quote') document.add_paragraph('列表無序符號',style='List Bullet') document.add_paragraph('列表有序符號',style='List Number') document.add_picture('test.bmp',width=Inches(1.25)) table = document.add_table(rows=1,cols=3) hdr_cells = table.rows[0].cells hdr_cells[0].text = 'Qty' hdr_cells[1].text = 'Id' hdr_cells[2].text = 'Desc' for item in range(2): row_cells = table.add_row().cells row_cells[0].text = 'a' row_cells[1].text = 'b' row_cells[2].text = 'c' document.add_page_break() document.save('test.docx')
首先引入python-docx,from docx import Document
,接著透過 Document() 建構函式宣告一個 Document 物件。
add_heading()
是建立標題的方法
document.add_paragraph()
建立段落
add_run()
可以設定粗體或斜體等等特殊格式,屬於paragraph下的方法,必須搭配paragraph物件使用
document.add_picture()
用來插入圖片
document.add_table(rows=x, cols=y)
用來建立表格,表格傳入參數為y行與x列
document.add_page_break()
插入換頁符號
document.save('test.docx')
儲存 docx 檔案到 test.docx
有興趣深入研究可以參考官方文檔。
讀取Word資料
首先產生Word物件,並指向Word檔案,接著使用paragraphs()取得Word物件全部內容;循環paragraphs物件取得每行資料並寫入列表。
將清單轉為字串,每個清單元素使用分行符號連接,轉換後的資料的段落版面配置與Word文件類似。
import docx def readDocx(docName): fullText = [] doc = docx.Document(docName) paras = doc.paragraphs for p in paras: fullText.append(p.text) return '\n'.join(fullText) print(readDocx('test.docx'))
讀取結果
Python Python - 資料儲存 - Word - 儲存實例. 樣式 - 明顯參考 列表無序符號 列表有序符號
- 解決 preact-router 資源請求路徑錯誤的問題 - 2022 年 6 月 24 日
- [楓之谷私服] 潮流轉蛋機 NPC 腳本優化 - 2022 年 6 月 19 日
- [楓之谷私服] 簡單的飛天椅子(坐騎)改法 v120 - 2022 年 6 月 19 日