天天看點

辦公自動化辦公自動化

辦公自動化

一、用Python讀寫CSV檔案

1.1 CSV檔案介紹

CSV(Comma Separated Values)全稱逗号分隔值檔案是一種簡單、通用的檔案格式,被廣泛的應用于應用程式(資料庫、電子表格等)資料的導入和導出以及異構系統之間的資料交換。因為CSV是純文字檔案,不管是什麼作業系統和程式設計語言都是可以處理純文字的,而且很多程式設計語言中都提供了對讀寫CSV檔案的支援,是以CSV格式在資料處理和資料科學中被廣泛應用。

CSV檔案有以下特點:

  1. 純文字,使用某種字元集(如ASCII、Unicode、GB2312)等);
  2. 由一條條的記錄組成(典型的是每行一條記錄);
  3. 每條記錄被分隔符(如逗号、分号、制表符等)分隔為字段(列);
  4. 每條記錄都有同樣的字段序列。

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)