辦公自動化
一、用Python讀寫CSV檔案
1.1 CSV檔案介紹
CSV(Comma Separated Values)全稱逗号分隔值檔案是一種簡單、通用的檔案格式,被廣泛的應用于應用程式(資料庫、電子表格等)資料的導入和導出以及異構系統之間的資料交換。因為CSV是純文字檔案,不管是什麼作業系統和程式設計語言都是可以處理純文字的,而且很多程式設計語言中都提供了對讀寫CSV檔案的支援,是以CSV格式在資料處理和資料科學中被廣泛應用。
CSV檔案有以下特點:
- 純文字,使用某種字元集(如ASCII、Unicode、GB2312)等);
- 由一條條的記錄組成(典型的是每行一條記錄);
- 每條記錄被分隔符(如逗号、分号、制表符等)分隔為字段(列);
- 每條記錄都有同樣的字段序列。
1.2将資料寫入CSV檔案
現有五個學生三門課程的考試成績需要儲存到一個CSV檔案中,要達成這個目标,可以使用Python标準庫中的
csv
子產品,該子產品的
writer
函數會傳回一個
csvwriter
對象,通過該對象的
writerow
或
writerows
方法就可以将資料寫入到CSV檔案中,具體的代碼如下所示。
import csv
import random
with open('scores.csv', 'w') as file:
writer = csv.writer(file)
writer.writerow(['姓名', '國文', '數學', '英語'])
names = ['關羽', '張飛', '趙雲', '馬超', '黃忠']
for i in range(5):
verbal = random.randint(50, 100)
math = random.randint(40, 100)
english = random.randint(30, 100)
writer.writerow([names[i], verbal, math, english])
需要說明的是上面的
writer
函數,該函數除了傳入要寫入資料的檔案對象外,還可以
dialect
參數,它表示CSV檔案的方言,預設值是
excel
。
1.3從CSV檔案讀取資料
如果要讀取剛才建立的CSV檔案,可以使用下面的代碼,通過
csv
子產品的
reader
函數可以建立出
csvreader
對象,該對象是一個疊代器,可以通過
next
函數或
for-in
循環讀取到檔案中的資料。
import csv
with open('scores.csv', 'r') as file:
reader = csv.reader(file, delimiter='|')
for line in reader:
print(reader.line_num, end='\t')
for elem in line:
print(elem, end='\t')
print()
注意:上面的代碼對對象做
csvreader
循環時,每次會取出一個清單對象,該清單對象包含了一行中所有的字段。
for
二、用Python讀寫Excel檔案
2.1讀Excel檔案
例如在目前檔案夾下有一個名為“阿裡巴巴2017年股票資料.xlsx”的Excel檔案,如果想讀取并顯示該檔案的内容,可以通過如下所示的代碼來完成。
import xlrd
# 使用xlrd子產品的open_workbook函數打開指定Excel檔案并獲得Book對象(工作簿)
wb = xlrd.open_workbook('阿裡巴巴2017年股票資料.xlsx')
# 通過Book對象的sheet_names方法可以擷取所有表單名稱
sheetname = wb.sheet_names()[0]
# 通過指定的表單名稱擷取Sheet對象(工作表)
sheet = wb.sheet_by_name(sheetname)
# 通過Sheet對象的nrows和ncols屬性擷取表單的行數和列數
print(sheet.nrows, sheet.ncols)
for row in range(sheet.nrows):
for col in range(sheet.ncols):
# 通過Sheet對象的cell方法擷取指定Cell對象(單元格)
# 通過Cell對象的value屬性擷取單元格中的值
value = sheet.cell(row, col).value
# 對除首行外的其他行進行資料格式化處理
if row > 0:
# 第1列的xldate類型先轉成元組再格式化為“年月日”的格式
if col == 0:
# xldate_as_tuple函數的第二個參數隻有0和1兩個取值
# 其中0代表以1900-01-01為基準的日期,1代表以1904-01-01為基準的日期
value = xlrd.xldate_as_tuple(value, 0)
value = f'{value[0]}年{value[1]:>02d}月{value[2]:>02d}日'
# 其他列的number類型處理成小數點後保留兩位有效數字的浮點數
else:
value = f'{value:.2f}'
print(value, end='\t')
print()
# 擷取最後一個單元格的資料類型
# 0 - 空值,1 - 字元串,2 - 數字,3 - 日期,4 - 布爾,5 - 錯誤
last_cell_type = sheet.cell_type(sheet.nrows - 1, sheet.ncols - 1)
print(last_cell_type)
# 擷取第一行的值(清單)
print(sheet.row_values(0))
# 擷取指定行指定列範圍的資料(清單)
# 第一個參數代表行索引,第二個和第三個參數代表列的開始(含)和結束(不含)索引
print(sheet.row_slice(3, 0, 5))
相信通過上面的代碼,大家已經了解到了如何讀取一個Excel檔案,如果想知道更多關于
xlrd
子產品的知識,可以閱讀它的官方文檔。
2.2寫Excel檔案
寫入Excel檔案可以通過
xlwt
子產品的
Workbook
類建立工作簿對象,通過工作簿對象的
add_sheet
方法可以添加工作表,通過工作表對象的
write
方法可以向指定單元格中寫入資料,最後通過工作簿對象的
save
方法将工作簿寫入到指定的檔案或記憶體中。下面的代碼實作了将5個學生3門課程的考試成績寫入Excel檔案的操作。
import random
import xlwt
student_names = ['關羽', '張飛', '趙雲', '馬超', '黃忠']
scores = [[random.randint(40, 100) for _ in range(3)] for _ in range(5)]
# 建立工作簿對象(Workbook)
wb = xlwt.Workbook()
# 建立工作表對象(Worksheet)
sheet = wb.add_sheet('一年級二班')
# 添加表頭資料
titles = ('姓名', '國文', '數學', '英語')
for index, title in enumerate(titles):
sheet.write(0, index, title)
# 将學生姓名和考試成績寫入單元格
for row in range(len(scores)):
sheet.write(row + 1, 0, student_names[row])
for col in range(len(scores[row])):
sheet.write(row + 1, col + 1, scores[row][col])
# 儲存Excel工作簿
wb.save('考試成績表.xlsx')
2.3調整單元格樣式
在寫Excel檔案時,我們還可以為單元格設定樣式,主要包括字型(Font)、對齊方式(Alignment)、邊框(Border)和背景(Background)的設定,
xlwt
對這幾項設定都封裝了對應的類來支援。要設定單元格樣式需要首先建立一個
XFStyle
對象,再通過該對象的屬性對字型、對齊方式、邊框等進行設定,例如在上面的例子中,如果希望将表頭單元格的背景色修改為黃色,可以按照如下的方式進行操作。
header_style = xlwt.XFStyle()
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
# 0 - 黑色、1 - 白色、2 - 紅色、3 - 綠色、4 - 藍色、5 - 黃色、6 - 粉色、7 - 青色
pattern.pattern_fore_colour = 5
header_style.pattern = pattern
titles = ('姓名', '國文', '數學', '英語')
for index, title in enumerate(titles):
sheet.write(0, index, title, header_style)
如果希望為表頭設定指定的字型,可以使用
Font
類并添加如下所示的代碼。
font = xlwt.Font()
# 字型名稱
font.name = '華文楷體'
# 字型大小(20是基準機關,18表示18px)
font.height = 20 * 18
# 是否使用粗體
font.bold = True
# 是否使用斜體
font.italic = False
# 字型顔色
font.colour_index = 1
header_style.font = font
如果希望表頭垂直居中對齊,可以使用下面的代碼進行設定。
align = xlwt.Alignment()
# 垂直方向的對齊方式
align.vert = xlwt.Alignment.VERT_CENTER
# 水準方向的對齊方式
align.horz = xlwt.Alignment.HORZ_CENTER
header_style.alignment = align
如果希望給表頭加上黃色的虛線邊框,可以使用下面的代碼來設定。
borders = xlwt.Borders()
props = (
('top', 'top_colour'), ('right', 'right_colour'),
('bottom', 'bottom_colour'), ('left', 'left_colour')
)
# 通過循環對四個方向的邊框樣式及顔色進行設定
for position, color in props:
setattr(borders, position, xlwt.Borders.DASHED)
setattr(borders, color, 5)
header_style.borders = borders
如果要調整單元格的寬度(列寬)和表頭的高度(行高),可以按照下面的代碼進行操作。
# 設定行高為40px
sheet.row(0).set_style(xlwt.easyxf(f'font:height {20 * 40}'))
titles = ('姓名', '國文', '數學', '英語')
for index, title in enumerate(titles):
# 設定列寬為200px
sheet.col(index).width = 20 * 200
# 設定單元格的資料和樣式
sheet.write(0, index, title, header_style)