Python基礎 – 讀寫 CSV、EXCEL、WORD檔

最後更新於 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()
20200505170925 Python基礎 - 讀寫 CSV、EXCEL、WORD檔

:若出現「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')
20200505174617 Python基礎 - 讀寫 CSV、EXCEL、WORD檔

註:插入的圖片格式必須為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 documentationxlwt 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

20200505180836 Python基礎 - 讀寫 CSV、EXCEL、WORD檔

有興趣深入研究可以參考官方文檔

讀取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 - 儲存實例.
樣式 - 明顯參考
列表無序符號
列表有序符號
4e52d54f6bc42abb41d26eb5b0df6517?s=250&d=wavatar&r=g Python基礎 - 讀寫 CSV、EXCEL、WORD檔
0 0 評分數
Article Rating
訂閱
通知
guest
0 Comments
在線反饋
查看所有評論