Python處理CSV,Excel,PDF和圖片

使用Python處理CSV格式數據

CSV數據:

逗號分隔值(Comma-Separated Values,CSV,有時也稱爲字符分隔值,因爲分隔字符也可以不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。純文本意味着該文件是一個字符序列,不含必須像二進制數字那樣被解讀的數據。CSV文件由任意數目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見的是逗號或製表符。通常,所有記錄都有完全相同的字段序列。

如一下格式:27,20,14,15,14,12,94,64,37,1015,1013,1009,7,5,2,21,8,35,0.00,,,152

.csv文件可以直接用excel或者類似軟件打開,樣子都是我們常見的表格形式。

代碼如下:

import csv

fileName = 'weather.csv'

with open(fileName, "r", encoding="utf-8") as f:

    text = csv.reader(f)

    for i in text:

        print(i)

print("####"*10)

with open(fileName, "r", encoding="utf-8") as f:

    for i in f.readlines():

        print(i.split(","))



使用Python處理Excel格式數據

python處理excel文件用的第三方模塊庫有xlrd、xlwt、xluntils和pyExcelerator,除此之外,python處理excel還可以用win32com和openpyxl模塊。

使用pip安裝第三方庫

Pip install xlrd

Pip install xlwt

Pip install xluntils

Pip install pyExcelerator

Xlrd只能進行讀取excel文件,沒法進行寫入文件,xlwt可以寫入文件,但是不能在已有的excel的文件上進行修改,如果有這個需求,就需要使用xluntils模塊了,pyExcelerator模塊與xlwt類似,也可以用來生成excel文件。


使用xlrd讀取單表文件:

import xlrd

def readExcel():

    data = xlrd.open_workbook('test.xlsx')

    table = data.sheets()[0] # 打開第一張表

    nrows = table.nrows # 獲取表的行數

    for i in range(nrows): # 循環逐行打印

        print(table.row_values(i))#通過row_values來獲取每行的值

readExcel()


讀取單表複雜例子:

# 打開一個workbook

workbook = xlrd.open_workbook('testdata.xlsx')

# 抓取所有sheet頁的名稱

worksheets = workbook.sheet_names()

print(workbook.sheets())

print('worksheets is {0}'.format(worksheets))

# 定位到sheet1

# worksheet1 = workbook.sheet_by_name(u'Sheet1')

worksheet1 = workbook.sheets()[1]

"""

#通過索引順序獲取

worksheet1 = workbook.sheets()[0]

"""

"""

#遍歷所有sheet對象

for worksheet_name in worksheets:

worksheet = workbook.sheet_by_name(worksheet_name)

"""

# 遍歷sheet1中所有行row

num_rows = worksheet1.nrows

for curr_row in range(num_rows):

    row = worksheet1.row_values(curr_row)

    print('row%s is %s' % (curr_row, row))

# 遍歷sheet1中所有列col

num_cols = worksheet1.ncols

for curr_col in range(num_cols):

    col = worksheet1.col_values(curr_col)

    print('col%s is %s' % (curr_col, col))

# 遍歷sheet1中所有單元格cell

for rown in range(num_rows):

    for coln in range(num_cols):

        cell = worksheet1.cell_value(rown, coln)

        print(cell)


使用xlwt寫入Excel文件:

import xlwt

#創建workbook和sheet對象

workbook = xlwt.Workbook() #注意Workbook的開頭W要大寫

sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True)

sheet2 = workbook.add_sheet('sheet2', cell_overwrite_ok=True)

sheet3 = workbook.add_sheet('sheet3', cell_overwrite_ok=True)

#向sheet頁中寫入數據

sheet1.write(0,0,'this should overwrite1')

sheet1.write(0,1,'aaaaaaaaaaaa')

sheet2.write(0,0,'this should overwrite2')

sheet2.write(1,2,'bbbbbbbbbbbbb')

#-----------使用樣式-----------------------------------

#初始化樣式

style = xlwt.XFStyle()

#爲樣式創建字體

font = xlwt.Font()

font.name = 'Times New Roman'

font.bold = True

#設置樣式的字體

style.font = font

#使用樣式

sheet3.write(0,1,'some bold Times text',style)

#保存該excel文件,有同名文件時直接覆蓋

workbook.save('test2.xls')

print('創建excel文件完成!')


Excel處理超鏈接

import codecs

import xlwt

book = xlwt.Workbook()

sheet_index = book.add_sheet('index')

line=0

for i in range(9):

    link = 'HYPERLINK("{0}.txt", "{1}_11111")'.format(i, i)

    sheet_index.write(line, 0, xlwt.Formula(link))

    line += 1

book.save('simple2.xls')

for i in range(0, 9):

    file = str(i) + ".txt"

    with codecs.open(file, 'w') as f:

        f.write(str(i)*10)


使用Python修改Excel表格內容:

不支持使用xlsx文件,直接使用xls就沒有問題,如果使用xlsx文件,容易發生問題。

import xlrd

import xlutils.copy

#打開一個workbook

rb = xlrd.open_workbook('aaa111.xls')

wb = xlutils.copy.copy(rb)

#獲取sheet對象,通過sheet_by_index()獲取的sheet對象沒有write()方法

ws = wb.get_sheet(0)

#寫入數據

ws.write(10, 10, 'changed!')

#添加sheet頁

wb.add_sheet('sheetnnn2',cell_overwrite_ok=True)

#利用保存時同名覆蓋達到修改excel文件的目的,注意未被修改的內容保持不變

wb.save('aaa111.xls')




Python處理PDF文件

讀取PDF文件

from pdfminer.pdfparser import PDFParser, PDFDocument

from pdfminer.pdfparser import PDFPage

from pdfminer.pdfinterp import PDFResourceManager, PDFTextExtractionNotAllowed

from pdfminer.pdfinterp import PDFPageInterpreter

from pdfminer.pdfdevice import PDFDevice

from pdfminer.layout import LAParams

from pdfminer.converter import PDFPageAggregator

#獲取文檔對象,你把algorithm.pdf換成你自己的文件名即可。

fp=open("test.pdf","rb")

#創建一個與文檔相關聯的解釋器

parser=PDFParser(fp)

#PDF文檔對象,提供密碼初始化,沒有就不用帶password參數。

doc=PDFDocument()

parser.set_document(doc)

doc.set_parser(parser)

doc.initialize()

#檢查文件是否允許文本提取

if not doc.is_extractable:

    raise PDFTextExtractionNotAllowed

#鏈接解釋器和文檔對象

# parser.set_document(doc)

#doc.set_paeser(parser)

#初始化文檔

#doc.initialize("")

#創建PDF資源管理器對象來存儲共享資源

resource=PDFResourceManager()

#參數分析器

laparam=LAParams()

#創建一個聚合器

device=PDFPageAggregator(resource, laparams=laparam)

#創建PDF頁面解釋器

interpreter=PDFPageInterpreter(resource,device)

#使用文檔對象得到頁面集合

for page in doc.get_pages():

  #使用頁面解釋器來讀取

  interpreter.process_page(page)

  #使用聚合器來獲取內容

  layout=device.get_result()

  for out in layout:

    if hasattr(out, "get_text"):

      print(out.get_text())


html轉換爲PDF文件

安裝pdfkit模塊

pip install pdfkit

#網頁轉換成pdf

直接把url轉換成pdf文件

import pdfkit

pdfkit.from_url('http://google.com', 'out1.pdf')

#Html轉換成pdf

Import pdfkit

pdfkit.from_file('test.html', 'out2.pdf')

#字符創轉換成pdf

Import pdfkit

pdfkit.from_string('Hello lingxiangxiang!', 'out3.pdf')


合併多個PDF文件

import PyPDF2

import os

#建立一個裝pdf文件的數組

pdfFiles = []

for fileName in os.listdir('XX'):    #遍歷該程序所在文件夾內的文件

    if fileName.endswith('.pdf'):   #找到以.pdf結尾的文件

        pdfFiles.append(fileName)   #將pdf文件裝進pdfFiles數組內

# pdfFiles.sort()     #文件排序

print(pdfFiles)

os.chdir("aming")

pdfWriter = PyPDF2.PdfFileWriter()     #生成一個空白的pdf文件

for fileName in pdfFiles:

    pdfReader = PyPDF2.PdfFileReader(open(fileName,'rb'))   #以只讀方式依次打開pdf文件

    for pageNum in range(pdfReader.numPages):

        print(pdfReader.getPage(pageNum))

        pdfWriter.addPage(pdfReader.getPage(pageNum))    #將打開的pdf文件內容一頁一頁的複製到新建的空白pdf裏

pdfOutput = open('combine.pdf','wb')     #生成combine.pdf文件

pdfWriter.write(pdfOutput)               #將複製的內容全部寫入combine.pdf

pdfOutput.close()




Python處理圖片

PIL (Python Imaging Library)是 Python 中最常用的圖像處理庫,如果你是python2.x,可以通過以下地址進行下載:http://www.pythonware.com/products/pil/index.htm,找到相對應的版本進行下載就可以了。

注意:PIL模塊在python3.x中已經替換成pillow模塊,文檔地址:http://pillow.readthedocs.io/en/latest/,直接使用pip3 install pillow即可安裝模塊,導入時使用from PIL import Image。

代碼如下:

from PIL import Image

image = Image.open("1.jpg")

print(image.format, image.size, image.mode)

image.show()

結果:

JPEG (1080, 1920) RGB

並把圖片打開,展示出來


Image的三個屬性:

    format : 識別圖像的源格式,如果該文件不是從文件中讀取的,則被置爲 None 值。

    size : 返回的一個元組,有兩個元素,其值爲象素意義上的寬和高。

    mode : RGB(true color image),此外還有,L(luminance),CMTK(pre-press image)。


Image的方法介紹:

    show():顯示最近加載的圖像

    open(infilename):  打開文件

    save(outfilename):保存文件

    crop((left, upper, right, lower)):從圖像中提取出某個矩形大小的圖像。它接收一個四元素的元組作爲參數,各元素爲(left, upper, right, lower),座標系統的原點(0, 0)是左上角。


Image的幾何處理:

out = im.resize((128, 128))                     #調整圖片大小

out = im.rotate(45)                             #逆時針旋轉 45 度角。

out = im.transpose(Image.FLIP_LEFT_RIGHT)       #左右對換。

out = im.transpose(Image.FLIP_TOP_BOTTOM)       #上下對換。

out = im.transpose(Image.ROTATE_90)             #旋轉 90 度角。

out = im.transpose(Image.ROTATE_180)            #旋轉 180 度角。

out = im.transpose(Image.ROTATE_270)            #旋轉 270 度角。


使用Python摳圖

from PIL import Image

image = Image.open("1.jpg")

print(image.format, image.size, image.mode)

box = (600, 300, 1050, 660)

region = image.crop(box)

region.save("cutting.jpg")

上述代碼講圖片的((600, 300), (600, 660), (1050, 300), (1050, 660))所畫出來的區域進行裁剪,並保存在cutting.jpg中


使用Python拼圖

from PIL import Image

image = Image.open("1.jpg")

print(image.format, image.size, image.mode)

box = (600, 300, 1050, 660)

egion = image.crop(box)

#egion.save("cutting.jpg")

region = egion.transpose(Image.ROTATE_180)

image.paste(region, box)

image.show()

把頭像照片截取出來,然後調換頭像照片180度,然後在拼接在一起


使用Python縮放圖片

from PIL import Image

infile = "2.jpg"

outfile = "new2.jpg"

image = Image.open(infile)

(x, y) = image.size

newx = 300

newy = int(y*newx/x)

out = image.resize((newx, newy), Image.ANTIALIAS)

out.show()


Python處理驗證碼

import random

import string

import sys

import math

from PIL import Image, ImageDraw, ImageFont, ImageFilter

# 字體的位置,不同版本的系統會有不同

font_path = 'msyh.ttf'

# 生成幾位數的驗證碼

number = 4

# 生成驗證碼圖片的高度和寬度

size = (100, 30)

# 背景顏色,默認爲白色

bgcolor = (255, 255, 255)

# 字體顏色,默認爲藍色

fontcolor = (0, 0, 255)

# 干擾線顏色。默認爲紅色

linecolor = (255, 0, 0)

# 是否要加入干擾線

draw_line = True

# 加入干擾線條數的上下限

line_number = 20

# 用來隨機生成一個字符串

def gene_text():

    source = list(string.ascii_letters)

    for index in range(0, 10):

        source.append(str(index))

    return ''.join(random.sample(source, number))  # number是生成驗證碼的位數

# 用來繪製干擾線

def gene_line(draw, width, height):

    begin = (random.randint(0, width), random.randint(0, height))

    end = (random.randint(0, width), random.randint(0, height))

    draw.line([begin, end], fill=linecolor)

# 生成驗證碼

def gene_code():

    width, height = size  # 寬和高

    image = Image.new('RGBA', (width, height), bgcolor)  # 創建圖片

    font = ImageFont.truetype(font_path, 25)  # 驗證碼的字體

    draw = ImageDraw.Draw(image)  # 創建畫筆

    text = gene_text()  # 生成字符串

    font_width, font_height = font.getsize(text)

    draw.text(((width - font_width) / number, (height - font_height) / number), text, font=font, fill=fontcolor)  # 填充字符串

    if draw_line:

        for i in range(line_number):

            gene_line(draw, width, height)

    # image = image.transform((width + 20, height + 10), Image.AFFINE, (1, -0.3, 0, -0.1, 1, 0), Image.BILINEAR)  # 創建扭曲

    image = image.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 濾鏡,邊界加強

    image.save('idencode.png')  # 保存驗證碼圖片

    # image.show()

 

if __name__ == "__main__":

    gene_code()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章