Python處理Excel和PDF文檔


一、使用Python操作Excel

  Python來操作Excel文檔以及如何利用Python語言的函數和表達式操縱Excel文檔中的數據。

  雖然微軟公司本身提供了一些函數,我們可以使用這些函數操作Excel文檔。但是,使用Excel自帶的函數受限於Excel軟件的功能限制。換句話說,只有微軟提供了某種功能,我們才能使用相應的功能解決問題。如果微軟沒有提供相應的函數應對一個復雜的功能,那么,我們只能進行重復性操作。使用Python語言操作Excel則不然,我們可以靈活應用Python語言的所有功能,讀取、計算和編輯Excel文檔中的數據。

  一、Python處理Excel之openpyxl

  1、openpyxl簡介和安裝

    1、openpyxl簡介

  openpyxl是一個讀寫Excel2010(xlsx/xlsm)文檔的Python庫,如果要處理更早格式的Excel文檔,需要用到另外的庫。openpyxl是一個比較綜合的工具,能夠同時讀取和修改Excel文檔。XlsxWriter也是一個與Excel處理相關的知名項目,僅支持創建和寫入Excel文檔,不支持讀取Excel文檔。

    2、openpyxl安裝
pip install openpyxl

  2、使用openpyxl讀取Excel文檔

    1、Excel的構成

  一個Excel文檔稱為一個工作簿,在Office2010下,典型工作簿的文件擴展名為xlsx。一個工作簿可以包含多個表格(在Excel又稱為sheet)。打開工作簿后會默認顯示一個表格,這個表格一般稱為活躍表。表格中包含若干單元格,所有單元格都有一個唯一的坐標。Excel通過行和列表示一個單元格,其中,行的坐標使用數字表示,列的坐標使用字母表示。

    2、openpyxl處理Excel文件

  openxpyxl中有三個不同層次的類,分別是Workbook、Worksheet和Cell。Workbook是對Excel工作簿的抽象,Worksheet是對表格的抽象,Cell是對單元格的抽象。每一個類都包含了若干屬性和方法,以便於我們通過這些屬性和方法獲取表格中的數據。

  例如,我們要打開一個Excel表格或者創建一個Excel文檔,都需要創建一個Workbook對象。我們需要獲取Excel文檔中的某一張表,應該先創建一個Workbook對象,然后使用該對象的方法來得到一個Worksheet對象。如果要讀取或者修改某個單元格,我們需要先獲得Worksheet對象,然后再獲取代表單元格的Cell對象。

  一個Workbook對象代表一個Excel文檔,因此,在操作一個Excel之前,應該先創建一個Workbook對象。對於創建一個新的Excel文檔,直接進行Workbook類調用即可。對於讀取一個已有的Excel文檔,可以使用openpyxI模塊的load_workbook函數。該函數接受多個參數,但只有filename參數為必傳參數。filenmame可以是一個文件名,也可以是一個打開的文件對象。

import openpyxl
wb=openpyxl.load_workbook('example.xls')

  調用完load_workbook函數以后,我們就得到了一個Workbook對象。Workbook對象有很多的屬性和方法,其中,大部分方法都與sheet相關。

  Workbook對象的部分屬性如下:

1 active:獲取活躍的Worksheet;
2 read_only:是否以read_only模式打開Excel文檔;
3 encoding:文檔的字符集編碼;
4 properties:文檔的元數據,如標題,創建者,創建日期等;
5 worksheets:以列表的形式返回所有的Worksheet。
#操作
print(wb.active)
print(wb.read_only)
print(wb.encoding)
print(wb.worksheets)

#結果如下
<Worksheet "product">
False
utf-8
[<Worksheet "pre">, <Worksheet "product">]
實操

  Workbook對象的方法大都與Worksheet相關。常用的方法如下:

1 sheetnames:獲取所有表格的名稱;
2 [sheetname]:通過表格名稱獲取Worksheet對象;
3 active:獲取活躍的表格;
4 remove:刪除一個表格;
5 create_sheet:創建一個空的表格;
6 copy_worksheet:在Workbook內拷貝表格
#實操
print(wb.sheetnames)
print(wb['pre'])
print(wb.active)
print(wb.create_sheet(index=0, title='new sheet'))
print(wb.sheetnames)
print(wb.remove(wb['new sheet']))
print(wb.sheetnames)
print(wb.copy_worksheet(wb['pre']))
###將修改保存(從內存刷到磁盤)
wb.save('example.xlsx')

#結果
<Worksheet "new sheet">
['new sheet', 'pre', 'product']
['new sheet', 'pre', 'product']
<Worksheet "pre">
<Worksheet "pre Copy">
實操

  有了Worksheet對象以后,我們可以通過這個Worksheet對象獲取表格的屬性,得到單元格中的數據,修改表格中的內容。openpyxI提供了非常靈活的方式來訪問表格中的單元格和數據。

  常用的Worksheet屬性如下:

 1 title:表格的標題;
 2 dimensions:表格的大小,這里的大小是指有含有數據的表格大小。例如,對於example.xlsx文件,dimensions屬性的值為'Al:El1';
 3 maxrow:表格的最大行;
 4 min_row:表格的最小行;
 5 maxcolumn:表格的最大列;
 6 mincolumn:表格的最小列;
 7 rows:按行獲取單元格(Cell對象);
 8 columns:按列獲取單元格(Cell對象);
 9 freeze_panes:凍結窗格;
10 values:按行獲取表格的內容(數據)。
#實操
ws = wb['pre']
print(ws.title)
print(ws.max_row)

#結果如下
pre
59
實操

  通過不同的屬性名獲取student這張表的屬性。其中,columns、rows和values這幾個屬性都是通過生成器的方式返回數據

  openpyxl並不知道我們的表格中有多少數據,在數據量大的情況下,如果一次獲取所有數據,勢必會占用較多的內存。因此,openpyxl的設計中,需要返回數據時都是通過生成器的方式返回。對於附件中的student表,因為記錄較少,我們可以使用list函數或tuple函數獲取所有的數值。需要注意的是,columns與rows返回的是Cell對象,values返回的是數據。

  freeze_panes這個參數比較特別,主要用於在表格較大時凍結頂部的行或左邊的列。對於凍結的行或列,就算用戶滾動電子表格,也是始終可見的。每個Worksheet對象都有一個freeze_panes屬性,可以設置為一個Cell對象或一個單元格坐標的字符串,單元格上面的行和左邊的列將會凍結(注意單元格所在的行和列並不會凍結)。例如,我們需要凍結第一行,那么freeze_panes取值應該為A2,如果要凍結第一列,freeze_panes取值為Bl。如果要同時凍結第一行和第一列,則freeze_panes取值為B2。freeze_panes取值為None表示不凍結任何窗格。

  Worksheet常用的一些方法:

1 iter_rows:按行獲取所有單元格(Cell對象);
2 iter_columns:按列獲取所有的單元格;
3 append:在表格末尾添加數據;
4 merged_cells:合並多個單元格;
5 unmerge_cells:移除合並的單元格。

  iter_rows方法和iter_columns方法在參數取默認值時,與rows屬性和columns屬性的作用相同。區別在於,iter_rows方法和iter_columns方法可以通過函數參數限定訪問表格的范圍。

print(list(ws.iter_rows(min_row=2,max_row=4,min_col=1,max_col=3)))

  從Worksheet的屬性和方法的使用中可以看到,很多屬性和方法返回的不是某一個具體的數值,而是一個Cell對象。一個Cell對象就代表一個單元格,我們可以直接使用Excel坐標的方式獲取Cell對象,也可以使用Worksheet的cell方法獲取Cell對象。如下所示:

print(ws['A1'])
print(ws.cell(row=1, column=2))

  Cell對象比較簡單,其常用的屬性如下:

1 row:單元格所在的行;
2 column:單元格所在的列;
3 value:單元格的取值;
4 cordinate:單元格的坐標
    3、openpyxl提供的各種API

  使用4種不同的方法來打印student表中的內容。為了對數據的格式進行控制,我們使用print函數而不是print語句進行打印。

  通過Worksheet的values方法打印表格中的數據,這也是打印數據最簡單的方法。values通過生成器訪問數據並按行返回,因此,我們使用for循環遍歷表格的內容。

from __future__ import print_function
for row in ws.values:
    print(*row)

  使用Worksheet的rows屬性來遍歷表格中的數據。rows屬性按行返回Cell對象,因此,我們使用列表推導來獲取每一個Cell對象的值。如下所示:

for row in ws.rows:
    print(*[cell.value for cell in row])

  Worksheet的iter_rows方法在不加任何參數的情況下與rows屬性效果相同,因此這種方法與前一種方法看起來很像

for row in ws.iter_rows():
    print(*[cell.value for cell in row])

  最后這種方式是最麻煩的方式,也是大家最容易想到的方式。我們首先獲取表格的最小行數和最大行數,然后獲取最小列數與最大列數,通過行和列的索引確定一個唯一元格。確定單元格以后,打印單元格的值。這種方式是每確定一個單元格打印一次,因此,我們在print函數中將end參數取值為空格來避免換行,並在內層for循環結束以后,顯示地進行換行。如下所示:

for i in range(ws.min_row, ws.max_row + 1):
    for j in range(ws.min_column, ws.max_column + 1):
        print(ws.cell(row=i ,column=j).value, end=' ')
    print()

  3、使用openpyxl修改Excel

  openpyxl不但可以讀取Excel文檔,而且還可以修改Excel文檔,包括修改單元格的 數據、合並單元格、修改單元格的字體、在Excel文檔中畫圖等。

  一個Workbook對象就代表了一個工作簿,因此,新建一個工作簿就是創建一個 Workbook對象。創建完Workbook對象以后,默認會有一個名為“sheetl”的表格,我們 可以通過表格的名稱或get_active_sheet方法來獲取這個表格。獲取表格以后,可以通過給 表格的title屬性賦值的方式來修改表格的名稱。

from openpyxl import Workbook

wb =Workbook()
wb.sheetnames

ws = wb.active
ws.title
ws.title = 'pre'

  修改

ws['A1'] = 'hello world'
wb.save('example.xlsx')

  二、其他操作Excel的方式

  1、xlrd主要是用來讀取excel文件

    1、安裝xlrd
pip install xlrd
    2、實操
import xlrd


workbook = xlrd.open_workbook('dns_records.xls')
sheet_names = workbook.sheet_names()

for sheet_name in sheet_names:
    sheet2 = workbook.sheet_by_name(sheet_name)
    print(sheet_name)
    rows = sheet2.row_values(3)  # 獲取第四行內容
    cols = sheet2.col_values(1)  # 獲取第二列內容

print(rows)
print(cols)
實操

  2、xlwt主要是用來寫excel文件

    1、安裝
pip install xlwt
    2、實操
import xlwt


wbk = xlwt.Workbook()
sheet = wbk.add_sheet('sheet 1')
sheet.write(0,1,'test text')#第0行第一列寫入內容
wbk.save('test.xls')
實操

  3、xlutils結合xlrd可以達到修改excel文件目的

    1、安裝
pip install xlutils
    2、實操
import xlrd
from xlutils.copy import copy


workbook = xlrd.open_workbook(u'有趣裝逼每日數據及趨勢.xls')
workbooknew = copy(workbook)
ws = workbooknew.get_sheet(0)
ws.write(3, 0, 'changed!')
workbooknew.save(u'有趣裝逼每日數據及趨勢copy.xls')
實操

  4、xlsxwriter可以寫excel文件並加上圖表

    1、安裝
pip install xlsxwriter
    2、實操
 1 import xlsxwriter
 2 
 3 
 4 def get_chart(series):
 5     chart = workbook.add_chart({'type': 'line'})
 6     for ses in series:
 7         name = ses["name"]
 8         values = ses["values"]
 9         chart.add_series({ 
10             'name': name,
11             'categories': 'A2:A10',
12             'values':values
13         })  
14     chart.set_size({'width': 700, 'height': 350}) 
15     return chart
16  
17 if __name__ == '__main__':
18     workbook = xlsxwriter.Workbook(u'H5應用中心關鍵數據及趨勢.xlsx') 
19     worksheet = workbook.add_worksheet(u"每日PV,UV")
20     headings = ['日期', '平均值']
21     worksheet.write_row('A1', headings)
22     index = 0
23     for row in range(1,10):
24         for com in [0,1]:
25             worksheet.write(row,com,index)
26             index+=1  
27     series = [{"name":"平均值","values":"B2:B10"}]
28     chart = get_chart(series)
29     chart.set_title ({'name': '每日頁面分享數據'})  
30     worksheet.insert_chart('H7', chart)
31     workbook.close()
實操

  三、Python3實戰

  1、Python處理excel並json序列化,並寫入文件中

import  xlrd
from collections import OrderedDict
import json

def login_pc_parameter():
    #excel的路徑
    wb = xlrd.open_workbook('pc_login.xlsx')
    convert_list = []
    #處理的sheet,默認是第一個(索引值為0)
    sh = wb.sheet_by_index(0)
    #顯示excel的標題,一般是第一行內容
    title = sh.row_values(0)

    for rownum in range(1, sh.nrows):
        #獲取每行的數據
        rowvalue = sh.row_values(rownum)
        #使用有序字典類,防止亂序
        single = OrderedDict()
        for colnum in range(0, len(rowvalue)):
            # print(title[colnum], rowvalue[colnum])
            single[title[colnum]] = rowvalue[colnum]
        convert_list.append(single)


    j = json.dumps(convert_list,ensure_ascii=False,indent=2)
    # print(convert_list)
    # print(j)

    with open("file3.json", "w",encoding="utf-8") as f:
        f.write(j)

if __name__ == '__main__':
    login_pc_parameter()

 

二、使用Python操作PDF

  PDF(Portable Document Format)是一種便攜式文檔格式,這種文檔格式與操作系統平台無關。PDF文件無論是在Windows,Unix還是在蘋果公司的MacOS操作系統中都是通用的,這一特點使它成為在Internet上進行電子文檔發行和數字化信息傳播的理想文檔格式。雖然PDF便於傳輸和閱讀,但是,編輯PDF卻很不容易。PyPDF2對編輯PDF提供了有限的支持,我們可以使用PyPDF2模塊讀取、合並和寫入PDF文檔。

  一、PyPDF2 安裝與介紹

  PyPDF2是一個純Python的開源庫,能夠分割或合並PDF文件,也可以裁剪或轉換 PDF文件中的頁面。我們還可以使用PyPDF2查看PDF文件的元信息,對PDF文件進行加密,破解PDF文件的密碼等。

  官網:https://pythonhosted.org/PyPDF2/

  安裝

pip install PyPDF2

  PyPDF2提供了4個主要的類,分別是PdfFileWriter、PdfFileReader、PdfFileMerger和PageObject。前三個類分別用以讀取PDF文件、寫入PDF文件與合並PDF文件。PageObject類代表了一個PDF頁面,可以使用PdfFileReader類的getPage方法得到一個PageObject對象。

  二、使用PdfFileReader讀取PDF文檔

  學習一個庫,最好的方式就是使用IPython進行練習。IPython能夠看到程序的中間結果,也可以方便地獲取幫助信息。接下來,我們就使用IPython學習PyPDF2的使用。在 IPython的交互模式下輸入以下代碼:

  1、獲取pdf文檔共有多少頁

import PyPDF2


reader = PyPDF2.PdfFileReader(open(u'Python Linux系統管理與自動化運維.pdf', 'rb'))
num_pages = reader.getNumPages()

print(num_pages)

  2、顯示pdf文檔的info信息

doc_info = reader.getDocumentInfo()

print(doc_info)

  結果如下

{'/CreationDate': "D:20171125012631+08'00'", '/Creator': 'Adobe Acrobat 11.0.10', '/ModDate': "D:20180430102312+08'00'", '/Producer': 'Adobe Acrobat Pro 11.0 Paper Capture Plug-in', '/Title': ''}

  三、使用PdfFileWrite創建PDF文檔

  對PDF文件進行加密、裁剪PDF文件、調整PDF頁面的順序等。我們需要編輯PDF頁面。例如,去除PDF文件中的第一頁,從一個PDF文件中提取幾個頁面保存到另一個文件。PyPDF2並不能直接編輯PDF文件,但是,我們可以利用PyPDF2從一個PDF文檔拷貝需要的頁面到另一個PDF文檔,通過這種迂回的方式實現編輯PDF的功能。

  例如,我們現在要修改Python Linux系統管理與自動化運維.pdf文件,僅僅保存該文件的第2頁、第5頁和第6頁。我們將這幾個頁面抽取出來,保存到另外一個PDF文件中,並對這個PDF文件進行加密。如下所示:

  1、將需要的內容寫入新的pdf文件

import PyPDF2


reader= PyPDF2.PdfFileReader(open(u'Python Linux系統管理與自動化運維.pdf', 'rb'))
output= PyPDF2.PdfFileWriter()
output.addPage(reader.getPage(1))
output.addPage(reader.getPage(4))
output.addPage(reader.getPage(5))
output.getNumPages()

  創建了一個PdtFileWriter對象和一個PdtFileReader對象。接着,我們使用PdtFileReader對象的getPage方法獲取需要的PDF頁面,並通過PdtFileWriter對象的addPage方法增加頁面。PdtFileWriter類有很多方法,如添加空白頁的addBlankPage方法、添加書簽的addBookmark方法、添加元信息的addMetadata方法以及對PDF進行加密的encrypt方法。在PdtFileWriter類的所有方法中,最常用的是addPage方法。

getNumPages方法獲取PdtFileWriter擁有的PDF頁面數。

  2、使用encrypt方法對PDF文件進行加密。

output.encrypt('123456')
outputStream = (open(u'Python Linux系統管理與自動化運維_test.pdf', 'wb'))
output.write(outputStream)
outputStream.close()

  四、修改PDF頁面

  需要修改PDF的頁面,PyPDF2也提供了部分支持,如旋轉頁面、添加水印。PageObject類中有部分方法可以修改PDF頁面,其中,rotateClockwise和rotateCounterClockwise方法用來旋轉頁面。這兩個方法只接受一個參數,且參數取值必須是90的倍數,表示旋轉多少度。下面的代碼將redbooks.pdf文件的首頁旋轉180度,並保存到一個新的文件中。

  1、旋轉文檔

import PyPDF2
reader = PyPDF2.PdfFileReader(open(u'Python Linux系統管理與自動化運維.pdf', 'rb'))
writer = PyPDF2.PdfFileWriter()
page = reader.getPage(20)
page.rotateClockwise(90)
writer.addPage(page)
outputStream = open("test.pdf", "wb")
writer.write(outputStream)
outputStream.close()

  2、給文檔添加水印

import PyPDF2
reader = PyPDF2.PdfFileReader(open(u'Python Linux系統管理與自動化運維.pdf', 'rb'))
watermark = PyPDF2.PdfFileReader(open(u'Python Linux系統管理與自動化運維.pdf', 'rb'))
writer = PyPDF2.PdfFileWriter()

for i in range(reader.getNumPages()):
    page = reader.getPage(i)
    page.mergePage(watermark.getPage(0))
    writer.addPage(page)
output_stream = open("watermark-test.pdf", 'wb')
writer.write(output_stream)
output_stream.close()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM