一、csv 文件格式二、excel數據處理2.1讀取單表文件:2.2 讀取單表文件復雜例子:2.3、寫入excel文件2.5、Python進行修改excel文件:三、Python處理pdf文件3.1、Python讀出pdf文件3.2、抓取每個的網頁,然后生成pdf文件3.3、Html轉pdf文件四、Python處理圖片4.1 Image的三個屬性:4.2、摳圖4.3、圖片拼合4.4、縮放:4.5、驗證碼
一、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(","))
二、excel數據處理
python提供有第三方庫來支持對excel的操作,python處理excel文件用的第三方模塊庫有xlrd、xlwt、xluntils和pyExcelerator,除此之外,python處理excel還可以用win32com和openpyxl模塊。下面我們先安裝第三方庫:
Pip install xlrd
Pip install xlwt
Pip install xluntils
Pip install pyExcelerator
Xlrd只能進行讀取excel文件,沒法進行寫入文件,xlwt可以寫入文件,但是不能在已有的excel的文件上進行修改,如果有這個需求,就需要使用xluntils模塊了,pyExcelerator模塊與xlwt類似,也可以用來生成excel文件。
2.1讀取單表文件:
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()
2.2 讀取單表文件復雜例子:
# 打開一個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)
2.3、寫入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文件完成!')
2.4、Excele來處理超鏈接
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)
2.5、Python進行修改excel文件:
但是不支持使用xlsx文件,直接使用xlsx就沒有問題,如果使用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文件
3.1、Python讀出pdf文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/06/09 14:46
# @Author : jiangshan
# @File : demon1.py
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())
3.2、抓取每個的網頁,然后生成pdf文件
import codecs
import os
import sys
import pdfkit
import requests
base_url = 'http://www.okay686.cn/'
if not os.path.exists("okay686"):
os.mkdir("okay686")
os.chdir("okay686")
s = requests.session()
for i in range(1, 27):
url = base_url + 'chapter' + str(i) + '.html'
print(url)
file = str(i) + '.pdf'
print(file)
config = pdfkit.configuration(wkhtmltopdf=r"D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe")
try:
pdfkit.from_url(url, file)
except:
continue
3.3、Html轉pdf文件
合並多個pdf文件為一個pdf文件
import PyPDF2
import os #建立一個裝pdf文件的數組
pdfFiles = []
for fileName in os.listdir('okay686'): #遍歷該程序所在文件夾內的文件
if fileName.endswith('.pdf'): #找到以.pdf結尾的文件
pdfFiles.append(fileName) #將pdf文件裝進pdfFiles數組內
# pdfFiles.sort() #文件排序
print(pdfFiles)
os.chdir("okay686")
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處理圖片
圖像處理是一門應用非常廣的技術,而擁有非常豐富第三方擴展庫的 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 並把圖片打開,展示出來
4.1 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)是左上角。
4.2、摳圖
需求,把頭像給截圖出來:
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中
4.3、圖片拼合
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度,然后在拼接在一起,
4.4、縮放:
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()
4.5、驗證碼
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()
