python3csv與xlsx文件操做模塊(csv、xlsxwriter)

1、csv模塊實現csv文件操做

一、CSV介紹

CSV,全稱爲Comma-Separated Values,它以逗號分隔值,其文件以純文本形式存儲表格數據,該文件是一個字符序列,能夠由任意數目的記錄組成,每條記錄有字段組成,字段間分隔符是逗號或製表符,至關於結構化的純文本形式,它比Excel文件更簡潔,用來存儲數據比較方便html

二、CSV經常使用類與方法

csv.reader(csvfile,dialect='excel',**fmtparams)python

遍歷CSV文件對象並返回,csvfiel能夠是任何支持迭代器協議的對象,若是csvfile是一個文件對象,它須要指定newline=''git

csv.writer(csvfile,dialect='excel',**fmtparams)github

寫入數據到csv文件中,csvfile能夠是具備寫入方法的任何對象,若是csvfiel是一個文件對象,應該用newline=''指定換行符(unix上位'\n',windows上位'\r\n')windows

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/6/27 11:44
# @Author  : Py.qi
# @File    : csv_file1.py
# @Software: PyCharm
import csv
iterable=[['1','zs',20,8998,20180627],['1','zs',20,8998,20180627],['1','zs',20,8998,20180627]]

with open('csvfile.csv','w',newline='') as csvf:
    spanwriter=csv.writer(csvf,dialect='excel')   #建立writer對象
    spanwriter.writerow(['id','name','age','salary','date'])  #使用writer的方法writerow寫入到文件
    spanwriter.writerows(iterable)  #迭代寫入數據

with open('csvfile.csv','r',newline='') as csvf:
    spamreader=csv.reader(csvf)  #建立reader對象
    for i in spamreader:
        print('\t'.join(i))   #指定分隔符,讀取csv文件數據


#
id    name    age    salary    date
1    zs    20    8998    20180627
1    zs    20    8998    20180627
1    zs    20    8998    20180627

class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)安全

以字典的形式讀取csv文件的行,fileldnames參數指定鍵,restkey指定默認key,restval指定默認value,dialect指定方言curl

class csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)函數

建立一個字典形式的csv操做對象,f爲寫入的文件,fieldnames爲制定key,restval制定默認value,extrasaction表示,若是在使用writerow()方法寫入數據的字典中字段名找不到的鍵,則此參數將執行操做,若是設置爲saise則會引起valueError,若是設置爲ignore則字典中的額外值將被忽略佈局

reader對象,DictReader實例和reader()對象具備的方法和屬性測試

csvreader.__next__():迭代讀取對象的下一行

csvreader.dialect:解析器使用的方言

csvreader.line_num:從源迭代器讀取的行數

csvreader.fieldnames:若是在建立對象時爲做爲參數傳遞,則在首次訪問文件或讀取第一條記錄是初始化此屬性,此屬性只適用於DictReader對象

writer對象,DictWriter和writer()實例對象具備的方法和屬性:

csvwriter.writerow():將行參數寫入到文件對象,根據當前的方言格式化

csvwriter.writerows(row):將row中的全部元素,行對象的迭代寫入到文件對象

csvwriter.dialect:解析器使用的方言

DictWriter.writeheader():寫入一行字段名,只適用於DictWriter對象

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/6/27 12:13
# @Author  : Py.qi
# @File    : csv_file2.py
# @Software: PyCharm
import csv
import pandas

iter=[
    {'id':2,'name':'wanwu','age':23,'date':20180627},
    {'id':3,'name':'zhaoliu','age':24,'date':20180627},
    {'id':4,'name':'tianqi','age':25,'date':20180627}
]
#寫入文件
with open('names.csv','w',newline='') as csvf:
    fieldnames=['id','name','age','date']
    writer=csv.DictWriter(csvf,fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'id':1,'name':'lisii','age':22,'date':20180627})
    writer.writerows(iter)

#讀取文件
with open('names.csv','r') as csvf:
    reader=csv.DictReader(csvf,fieldnames=fieldnames)
    for i in reader:
        print(i['id'],i['name'],i['age'],i['date'])

#也可使用pandas模塊來讀取csv文件
df=pandas.read_csv('names.csv')
print(df)

#
id name age date
1 lisii 22 20180627
2 wanwu 23 20180627
3 zhaoliu 24 20180627
4 tianqi 25 20180627

   id     name  age      date
0   1    lisii   22  20180627
1   2    wanwu   23  20180627
2   3  zhaoliu   24  20180627
3   4   tianqi   25  20180627

2、xlsxwriter模塊,實現Excel文件操做

Excel 是當今最流行的電子表格處理軟件,支持豐富的計算函數及圖表,在系統運營方

面普遍用於運營數據報表,好比業務質量、資源利用、安全掃描等報表,時也是應用系統
常見的文件導出格式, 以便數據使用人員作進一步加工處理。
利用 Python 操做Excel 的模塊 XlsxWriter(https: // xlsxwriter.readthedocs.org),能夠操做多個工做表的文字、數字、公式、圖表等。XlsxWriter 模塊具備如下功能:

  • 100 % 兼容的 Excel XLSX 文件,支持 Excel 200三、Excel 2007 等版本;
  • 支持全部 Excel 單元格數據格式;
  • 單元格合併、批註、自動篩選、豐富多格式字符串等;
  • 支持工做表 PNG、JPEG 圖像,自定義圖表;
  • 內存優化模式支持寫入大文件。

一、Xlsx Writer模塊的安裝

# pip install XlsxWriter #pip 安裝方法
# easy_install XlsxWriter #easy_install 安裝方法

# 源碼安裝方法
# curl -O -L http://github.com/jmcnamara/XlsxWriter/archive/master.tar.gz
# tar zxvf master.tar.gz
# cd XlsxWriter-master/
# sudo python setup.py install

簡單示例,建立一個Excel文件,插入文字、數字,計算公式和圖片,設置單元格格式

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/6/27 14:00
# @Author  : Py.qi
# @File    : xlsxWriter_f1.py
# @Software: PyCharm
import xlsxwriter

workbook=xlsxwriter.Workbook('demo.xlsx') #建立一個Excel文件
worksheet=workbook.add_worksheet() #建立一個工做表對象
worksheet.set_column('A:A',20) #設置第一列A寬度爲20像素
bold=workbook.add_format({'bold':True}) #定義一個加粗的格式對象
worksheet.write('A1','HELLO')  #A1單元格寫入HELLO
worksheet.write('A2','world',bold) #A2寫入world並引用加粗格式對象bold
worksheet.write('B2',u'中文測試',bold)  #B2寫入中文引用加粗格式bold
worksheet.write(2,0,32) #用行列表示法寫入數字32與35.5
worksheet.write(3,0,35.5) #行列表示法的單元格下標以0做爲起始值,‘3,0’等價與A3
worksheet.write(4,0,'=SUM(A3:A4)') #求和A3:A4
worksheet.insert_image('B5','14.png') #在B5插入圖片
workbook.close()

二、Xlsx Writer模塊經常使用方法

(1)Workbook 類

Workbook 類定義:Workbook(filename[, options])

該類實現建立一個 XlsxWriter 的 Workbook對象。Workbook 類表明整個電子表格文件,而且存儲在磁盤上。參數 filename(String 類型)爲建立的 Excel 文件存儲路徑;參數 options(Dict 類型)爲可選的 Workbook 參數,通常做爲初始化工做表內容格式,例如值爲 {'strings_to_numbers': True} 表示使用 worksheet.write() 方法時激活字符串轉換數字。

add_worksheet([sheetname])方法,做用是添加一個新的工做表,參數 sheetname(String 類型)爲可選的工做表名稱,默認爲 Sheet1

#添加一個新工做表名稱爲data
worksheet=workbook.add_worksheet('data')

add_format([properties]) 方法,做用是在工做表中建立一個新的格式對象來格式化單元格。參數 properties(dict 類型)爲指定一個格式屬性的字典,例如設置一個加粗的格式對象,workbook.add_format({'bold': True})

#!/usr/bin/env python
#coding:utf-8
import xlsxwriter

workfile=xlsxwriter.Workbook('test.xlsx')  #建立Excel文件
worksheet=workfile.add_worksheet('sh1')  #建立工做表
format=workfile.add_format({'bg_color':'red','font_size':'18','font_color':'yellow'}) #定義格式對象,背景爲紅色,字體大小18,字體顏色黃色
worksheet.set_column('A:A',20)  #設置A列寬度爲20像素
worksheet.write('A1','python',format)  #寫入文件並應用格式
workfile.close()  #關閉文件

更多格式化方法見http://xlsxwriter.readthedocs.io/format.html#format

add_chart(options)方法,做用是在工做表中建立一個圖表對象,內部是經過 insert_chart() 方法來實現,參數 options(dict 類型)爲圖表指定一個字典屬性,例如設置一個線條類型的圖表對象,代碼爲 chart = workbook.add_chart({'type': 'line'})

close() 方法,做用是關閉工做表文件,如 workbook.close()

(2)Worksheet 類

Worksheet 類表明了一個 Excel 工做表,是 XlsxWriter 模塊操做 Excel 內容最核心的一個類,例如將數據寫入單元格或工做表格式佈局等。Worksheet 對象不能直接實例化,取而代之的是經過 Workbook 對象調用 add_worksheet() 方法來建立。Worksheet 類提供了很是豐富的操做 Excel 內容的方法,其中幾個經常使用的方法以下:

write(row, col, *args) 方法

做用是寫普通數據到工做表的單元格,參數 row 爲行座標,col 爲列座標,座標索引發始值爲 0;* args 無名字參數爲數據內容,能夠爲數字、公式、字符串或格式對象。爲了簡化不一樣數據類型的寫入過程,write 方法已經做爲其餘更加具體數據類型方法的別名,包括:

write_string() 寫入字符串類型數據,如:worksheet.write_string(0, 0, 'Your text here')

write_number() 寫入數字類型數據,如:worksheet.write_number('A2', 2.3451)

write_blank() 寫入空類型數據,如:worksheet.write('A2', None)

write_formula() 寫入公式類型數據,如:worksheet.write_formula(2, 0, '=SUM(B1:B5)')

write_datetime() 寫入日期類型數據,如:worksheet.write_datetime(7, 0, datetime.datetime.strptime('2013-01-23','%Y-%m-%d'),workbook.add_format({'num_format': 'yyyy-mm-dd'}))

write_boolean() 寫入邏輯類型數據,如:worksheet.write_boolean(0, 0, True);

write_url() 寫入超連接類型數據,如:worksheet.write_url('A1', 'ftp://www.python.org/')

下面經過具體的示例來觀察別名write方法與數據類型方法的對應關係:

#!/usr/bin/env python
#coding:utf-8
import xlsxwriter
workbook=xlsxwriter.Workbook('test1.xlsx')
worksheet=workbook.add_worksheet(name='中文')
worksheet.write(0,0,'hello')  #寫入字符串
worksheet.write(1,0,2)
worksheet.write(2,0,3.001)   #寫入數字
worksheet.write(3,0,'=SIN(PI()/4)')   #寫入公式
worksheet.write(4,0,'')   #寫入空
worksheet.write(5,0,'http://www.baidu.com')  #寫入url
workbook.close()

set_row(row, height, cell_format, options)方法

做用是設置行單元格的屬性。參數row(int 類型)指定行位置,起始下標爲 0 ;參數 height(float 類型)設置行高,單位像素;參數 cell_format(format 類型)指定格式對象;參數 options(dict 類型)設置行 hidden(隱藏)、level(組合分級)、collapsed(摺疊)

worksheet.write('A1','hello')   #在A1寫入字符串
cell_format=workbook.add_format({'bold':True}) #定義加粗的格式對象
worksheet.set_row(0,40,cell_format)  #設置第1行單元格高度爲40像素,且引用加粗格式對象
worksheet.set_row(1,None,None,{'hidden':True})  #隱藏第2行單元格

set_column(first_col, last_col, width, cell_format, options)方法

做用爲設置一列或多列單元格屬性。參數 first_col(int 類型)指定開始列位置,起始下標爲 0 ;參數 last_col(int 類型)指定結束列位置,起始下標爲 0,能夠設置成與 first_col 同樣;參數width(float 類型)設置列寬;參數 cell_format(Format 類型)指定格式對象;參數options(dict 類型)設置行 hidden(隱藏)、level(組合分級)、collapsed(摺疊)

#!/usr/bin/env python
#coding:utf-8
import xlsxwriter
workbook=xlsxwriter.Workbook('test2.xlsx')
worksheet=workbook.add_worksheet('test')
worksheet.write('A1','Hello')
cell_format=workbook.add_format({'bold':True})
worksheet.set_column(0,1,10,cell_format)  #設置0到1即A到B列單元格寬度爲10像素,且引用加粗格式對象
worksheet.set_column('C:D',20)  #設置C到D列單元格寬度爲20像素
worksheet.set_column('E:G',None,None,{'hidden':1}) #隱藏E到G列單元格

insert_image(row, col, image[, options]) 方法:

做用是插入圖片到指定單元格,支持PNG、JPEG、BMP 等圖片格式。參數 row 爲行座標,col 爲列座標,座標索引發始值爲 0 ;參數 image(string 類型)爲圖片路徑;參數 options(dict 類型)爲可選參數,做用是指定圖片的位置、比例、連接 URL 等信息

#!/usr/bin/env python
#coding:utf-8
import xlsxwriter
workbook=xlsxwriter.Workbook('test3.xlsx')
worksheet=workbook.add_worksheet('test')
#在B5單元格插入22.jpg圖片,圖片超連接爲http://python.org
worksheet.insert_image('B5','D:/22.jpg',{'url':'http://python.org'})
workbook.close()

(3)Chart 類

Chart 類實如今 XlsxWriter 模塊中圖表組件的基類,支持的圖表類型包括面積、條形圖、柱形圖、折線圖、餅圖、散點圖、股票和雷達等,一個圖表對象是經過 Workbook(工做簿)的 add_chart 方法建立,經過 {type, ' 圖表類型 '} 字典參數指定圖表的類型,語句以下:

chart =workbook.add_chart({'type':'column'})   #建立一個column柱形圖表

更多圖表類型說明:

area:建立一個面積樣式的圖表

bar:建立一個條形樣式的圖表

column:建立一個柱形樣式的圖表

line:建立一個線條樣式的圖表

pie:建立一個餅圖樣式的圖表

scatter:建立一個散點樣式的圖表

stock:建立一個股票樣式的圖表

radar:建立一個雷達樣式的圖表

而後再經過 Worksheet(工做表)的 insert_chart() 方法插入到指定位置,語句以下:

worksheet.insert_chart('A7', chart)   # 在 A7 單元格插入圖表

下面介紹 chart 類的幾個經常使用方法:

chart.add_series(options) 方法:

做用爲添加一個數據系列到圖表,參數 options(dict類型) 設置圖表系列選項的字典,操做示例以下:

chart.add_series({
'categories': '=Sheet1!$A$1:$A$5',
'values': '=Sheet1!$B$1:$B$5',
'line': {'color': 'red'},
})

add_series 方法,最經常使用的三個選項爲 categories、values、line,其中 categories 做用是設置圖表類別標籤範圍;values 爲設置圖表數據範圍;line 爲設置圖表線條屬性,包括顏色、寬度等。

其餘經常使用方法及示例:

set_x_axis(options) 方法:設置圖表 X 軸選項,示例代碼以下:

chart.set_x_axis({
'name': 'Earnings per Quarter',        #設置 X 軸標題名稱
'name_font': {'size': 14, 'bold': True},    #設置 X 軸標題字體屬性
'num_font': {'italic': True },         #設置 X 軸數字字體屬性
})

set_size(options) 方法:設置圖表大小,如:chart.set_size({'width':720,'height':576}),其中width爲寬度,height爲高度
set_title(options) 方法:設置圖表標題,如:chart.set_title({'name':'Year End Results'})
set_style(style_id) 方法:設置圖表樣式,style_id 爲不一樣數字則表明不一樣樣式,如chart.set_style(37)
set_table(options) 方法:設置 X 軸爲數據表格形式,如 chart.set_table()

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/6/28 9:31
# @Author  : Py.qi
# @File    : chart_writer.py
# @Software: PyCharm
import xlsxwriter

#建立數據表
workbook=xlsxwriter.Workbook('test.xlsx')
worksheet=workbook.add_worksheet()
title=[u'部門名稱',u'一月份',u'二月份',u'三月份',u'四月份',u'五月份',u'平均值']
department=[u'技術部',u'市場部',u'財務部',u'工程部',u'安所有']
data=[
    [123,135,145,159,168],
    [88,99,105,112,146],
    [78,75,71,68,89],
    [110,123,159,189,201],
    [98,156,198,175,58],
]
format=workbook.add_format({'bold':True,'border':1,'bg_color':'#cccccc'})
format_val=workbook.add_format({'border':1,'align':'center'})
worksheet.set_row(0,20)
worksheet.set_column('A:F',10)
worksheet.write_row('A1',title,format)
worksheet.write_column('A2',department,format)
worksheet.write_row('B2',data[0],format_val)
worksheet.write_row('B3',data[1],format_val)
worksheet.write_row('B4',data[2],format_val)
worksheet.write_row('B5',data[3],format_val)
worksheet.write_row('B6',data[4],format_val)

#建立圖表
chart=workbook.add_chart({'type':'column'})
#圖表數據插入函數
def chart_series(cur_row):
    worksheet.write_formula('G'+cur_row,'=AVERAGE(B'+cur_row+':F'+cur_row+')',format_val)
    chart.add_series({
        'categories':'=Sheet1!$B$1:$F$1',
        'values':'=Sheet1!$B'+cur_row+':$F$'+cur_row,
        'name':'=Sheet1!$A$'+cur_row
    })
#循環插入數據
for i in range(2,7):
    chart_series(str(i))
chart.set_size({'width':677,'height':380}) #設置圖表寬和高
chart.set_title({'name':u'業績表'}) #設置圖表標題
#chart.set_table()  #設置圖表table樣式
worksheet.insert_chart('A10',chart) #圖表插入到工做表中
workbook.close()

三、定製自動化業務流量報表週報

經過XlsxWriter模塊將流量數據寫入Excel文檔,同時自動計算各頻道周平均流量,在生成數據圖表,具體是經過workbook.add_chart({'tyep':'column'})方法指定圖表類型爲柱形,使用write_row,write_column方法分別以行,列方式寫入數據,使用add_format()方法定製表頭,表體的顯示風格,使用add_series()方法將數據添加到圖表,同時使用chart.set_size,set_title,set_y_axis設置圖表的大小及標題屬性,最後經過insert_chart方法將圖表插入工做表中

#!/usr/bin/env python
#coding:utf-8
import xlsxwriter

workbook=xlsxwriter.Workbook('test4.xlsx')  #建立一個Excel文件
worksheet=workbook.add_worksheet()  #建立一個工做表對象
chart=workbook.add_chart({'type':'column'})  #建立柱形圖表
#定義數據表頭列表
title=[u'業務名稱',u'星期一',u'星期二',u'星期三',u'星期四',u'星期五',u'星期六',u'星期日',u'平局流量']
buname=[u'業務官網',u'新聞中心',u'購物頻道',u'體育頻道',u'親子頻道']  #定義頻道名稱
#定義5個頻道一週7天的數據列表
data=[
    [150,152,158,149,155,145,148],
    [88,89,95,93,98,100,99],
    [210,200,158,178,170,198,195],
    [75,77,78,78,74,70,79],
    [88,77,87,90,93,88,84],
]

format=workbook.add_format()  #定義format格式對象
format.set_border(1)  #定義format對象單元格邊框加粗1像素的格式

format_title=workbook.add_format() #定義title格式對象
format_title.set_border(1) #定義title格式
format_title.set_bg_color('#cccccc') #定義title對象背景顏色
format_title.set_align('center')  #定義title劇中對齊
format_title.set_bold()

format_ave=workbook.add_format() #定義format_ave格式對象
format_ave.set_border(1)
format_ave.set_num_format('0.00')  #定義數字類別顯示格式

#下面分別以行或列寫入方式將標題,業務名稱,流量數據寫入起初單元格,同時引用不一樣格式對象
worksheet.write_row('A1',title,format_title)
worksheet.write_column('A2',buname,format)
worksheet.write_row('B2',data[0],format)
worksheet.write_row('B3',data[1],format)
worksheet.write_row('B4',data[2],format)
worksheet.write_row('B5',data[3],format)
worksheet.write_row('B6',data[4],format)

#定義圖表數據系列函數
def chart_series(cur_row):
    worksheet.write_formula('I'+cur_row,'=AVERAGE(B'+cur_row+':H'+cur_row+')',format_ave)
    chart.add_series(
        {
            'categories':'=Sheet1!$B$1:$H$1',
            'values':'=Sheet1!$B$'+cur_row+':$H$'+cur_row,
            #'line':{'color':'black'},
            'name':'=Sheet1!$A$'+cur_row,
        }
    )

for row in range(2,7):
    chart_series(str(row))


chart.set_table()    #設置X軸表格格式
chart.set_style(30)  #設置圖表樣式
chart.set_size({'width':677,'height':380})
chart.set_title({'name':u'業務流量週報圖表'})
chart.set_y_axis({'name':'Mb/s'})

worksheet.insert_chart('A9',chart)
workbook.close()

 XlsxWriter官網:https://xlsxwriter.readthedocs.io/index.html

相關文章
相關標籤/搜索