图片处理
用Pillow操作图像
Pillow是python著名图像处理库PIL的分支
#测试颜色pillow
import PIL
from PIL import Image, ImageFilter
def main():
image = PIL.Image.open('70_2476.jpg')
print(image.size,image.format,image.mode)
#裁剪图片
#(距离左侧像素,距离上侧像素,左侧像素+截取图片宽度,上侧像素+截取图片宽度)
#即(left,left+width,top,top+height)
#j截取距离左侧200,宽度是700,距离上侧100,宽度是600
rect = (400,200,600,600)
image_suo = image.crop(rect)
image_suo.save('70_2476_caijian.jpg')
#缩略图
size = 400,200
image.thumbnail(size)
image.save('70_2476_suolue.jpg')
#黏贴图像
image2 = PIL.Image.open('70_1100.jpg')
#将image_suo粘贴在image2,距离左侧200,距离上侧200的位置
image2.paste(image_suo,(200,100))
image2.save('70_1100_zhantie.jpg')
#旋转
#旋转180度
image2_xuanzhuan = image2.rotate(180)
image2_xuanzhuan.save('70_1100_xuanzhuan.jpg')
#翻转图像FLIP_TOP_BOTTOM上下翻转,FLIP_LEFT_RIGHT左右反转
image2_fanzhuan = image2.transpose(Image.FLIP_TOP_BOTTOM)
image2_fanzhuan.save('70_1100_fanzhuan.jpg')
#操作像素
#putpixel()在指定的坐标处,指定颜色rgb
for x in range(200,250):
for y in range(300,350):
image2_fanzhuan.putpixel((x, y), (255, 210, 128))
image2_fanzhuan.save('image2_fanzhuan_pixel.jpg')
#各种滤镜ImageFilter.BLUR,ImageFilter.CONTOUR,ImageFilter.DETAIL
image2_fanzhuan.filter(ImageFilter.CONTOUR).save('image2_fanzhuan_lvjing.jpg')
if __name__ == '__main__':
main()
python处理excel
有很多第三方包,如xlrd,xlwt,openpyxl等。
xlrd,xlwt支持老版本的excel,具体是支持2003年以前的excel,老版本excel行数,列数有最大值限制,不能写入超过65535行、256列的数据。
import xlrd
def main():
#打开工作表,创建对象
wb = xlrd.open_workbook('filpath')
#返回工作表中所有的工作簿,可以通过索引调用
sheetLst = wb.sheets()
sheet1 = wb.sheet_by_index(0)
sheet2 = sheetLst[0]
#返回工作表中所有的工作簿名称,可以通过名称调用
sheetNameLst = wb.sheet_names()
sheet3= wb.sheet_by_name()
#获取工作簿的行数和列数
nrows = sheet1.nrows
ncols = sheet1.ncols
#获取某一行或者某一列的数据
#rowNum:行号,startRow:开始行,endRow:结束航
rowData = sheet1.row_values('rowNum','startRow','endRow')
colData = sheet1.col_values('colNum','startCol','endCol')
#操纵单元格
for row in sheet1.nrows:
for col in sheet1.ncols:
print(sheet1.cell(row,col).value)
if __name__ == '__main__':
main()
xlwt
import xlwt
def main():
#创建工作表
wb = xlwt.Workbook()
#添加工作簿cell_overwrite_ok参数控制是否可以对同一单元格重复操作覆盖等。
sheet = wb.add_sheet('sheetName',cell_overwrite_ok=True)
#给单元格赋值
sheet.write('rowNum','colNum','value')
#保存工作表,只能保存成xls,不能xlsx
wb.save('fileName.xls')
if __name__ == '__main__':
main()
openpyxl
#注意openpyxl的行,列的起始索引都是1。
import openpyxl
def main():
#打开工作表
wb = openpyxl.load_workbook('filepath')
#获取工作簿列表或者名字
sheets = wb.worksheets
sheetNames = wb.sheetnames
#get_sheet_names(),get_sheet_by_name()已经不建议使用
#某一个工作簿
sheet = sheets[0]
sheet1 = wb[sheetNames[0]] #通过工作簿名字
#最大行,最小行
rows = sheet1.max_row
cols = sheet1.max_column
#按行获取单元格对象,所有单元格。相当于iter_rows()
rowCells= sheet1.rows
for cellRow in rowCells:
print(','.join([cell.value for cell in cellRow]))
#按行获取单元格
cells = sheet1.iter_rows('min_row','max_row','min_col','max_col')
#按列获取单元格
sheet1.iter_columns('min_row','max_row','min_col','max_col')
for cellRow in cells:
print(cellRow )
#操作单元格,
value = sheet1.cell(row=1,column=2).value
wb = openpyxl.Workbook()
sheet = wb.create_sheet('tile',index)
#单元格赋值
sheet.cell(row=2,column=5).value = 5
#逐行写,添加一行到当前sheet的最底部(即逐行追加从第一行开始) iterable必须是list,tuple,dict,range,generator类型的。 1,如果是list,将list从头到尾顺序添加。 2,如果是dict,按照相应的键添加相应的键值。
#sheet.append(iterable)
sheet.append(['This is A1', 'This is B1', 'This is C1'])
sheet.append({'A': 'This is A1', 'C': 'This is C1'})
sheet.append({1: 'This is A1', 3: 'This is C1'})
wb.save('balances.xlsx')
xlrd | xlwt | openpyxl | |
---|---|---|---|
打开或创建工作表 | wb= open_workbook(filepath) | wb= Workbook(filepath) | wb= load_workbook(filepath)或Workbook(filepath) |
获取所有工作簿 | wb.sheets()或wb.sheet_names() | 属性不是方法 wb.worksheets, wb.sheetnames | |
获取或添加工作簿 | wb.sheets()[0]、wb.sheet_by_index(0)、wb.sheet_by_name(name) | wb.add_sheet(‘sheetName’) | wb.worksheets()[0]或wb[name] |
工作簿行数,列数 | sheet.nrows、sheet.ncols | sheet.max_row或sheet .max_column | |
按行获取单元格 | sheet.row_values(‘rowNum’,‘startRow’,‘endRow’) | sheet.iter_rows(‘min_row’,‘max_row’,‘min_col’,‘max_col’) | |
按列获取单元格 | sheet.col_values(‘colNum’,‘startCol’,‘endCol’) | sheet.iter_columns(‘min_row’,‘max_row’,‘min_col’,‘max_col’) | |
操作单元格 | sheet.cell(row,col).value | sheet.write(‘rowNum’,‘colNum’,‘value’) | sheet.cell(row=2,column=5).value = 5 |
保存 | wb.save(‘fileName.xls’) | wb.save(‘balances.xlsx’) |
操作word
python-docx是python提供的操作word的第三方包.
from docx import Document
from docx.shared import RGBColor
from docx.shared import Inches,Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.enum.style import WD_STYLE_TYPE
from docx.oxml.ns import qn
def main():
document = Document()
#修改文档样式Normal的字体类型,大小,颜色
document.styles['Normal'].font.name = u'微软雅黑'
document.styles['Normal'].font.size = Pt(10)
document.styles['Normal'].font.color.rgb = RGBColor(72, 62, 65)
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
#添加样式CitationsBold
styleBold = document.styles.add_style('CitationsBold', WD_STYLE_TYPE.PARAGRAPH)
paragraph_format_bold = styleBold.paragraph_format
#首行缩进
paragraph_format.first_line_indent = Inches(0.25)
#段前间距
paragraph_format_bold.space_before = Pt(30)
#段后间距
paragraph_format_bold.space_after = Pt(30)
#段内间距
paragraph_format_bold.line_spacing = Pt(20)
styleBold.font.color.rgb = RGBColor(72, 62, 65)
styleBold.font.name = u'微软雅黑'
styleBold.font.size = Pt(17)
styleBold.font.bold = True
styleBold._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
#添加一级标题
runTitle0 = document.add_heading(level=1).add_run("研究报告" )
runTitle0.font.name = u'微软雅黑'
runTitle0._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
#添加段落,赋予样式
document.add_paragraph( '研究动态', style='CitationsBold')
#添加图片
document.add_picture(stackplot, width=Inches(5.9))
#保存
document.save("filename.docx")
pdf转纯文本
import os
import re,codecs
from pdfminer.converter import PDFPageAggregator
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.layout import *
def pdfTotxt(filepath):
try:
fp = file(filepath, 'rb')
# 创建一个PDF文档解析器对象
parser = PDFParser(fp)
document = PDFDocument(parser)
# 创建一个PDF资源管理器对象来存储共享资源
# caching = False不缓存
rsrcmgr = PDFResourceManager(caching=False)
# 创建一个PDF设备对象
laparams = LAParams()
# 创建一个PDF页面聚合对象
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
# 创建一个PDF解析器对象
interpreter = PDFPageInterpreter(rsrcmgr, device)
replace = re.compile(r'\s+');
content = ''
# 循环遍历列表,每次处理一个page的内容
for page in PDFPage.create_pages(document):
interpreter.process_page(page)
# 接受该页面的LTPage对象
layout = device.get_result()
# 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象
# 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等
for x in layout:
# 如果x是水平文本对象的话
if (isinstance(x, LTTextBoxHorizontal)):
text = re.sub(replace, '', x.get_text())
text = text.replace(u'.', '')
if len(text) != 0:
content += text
# 关闭输入流
fp.close()
device.close()
return content
except Exception, e:
print "Exception:", e
生成pdf文件
from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
# pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('simhei', 'simhei.ttf'))
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Image,Frame, PageTemplate
def footer(canvas):
"""
设置页脚或页眉
:param canvas:Canvas类型 pdf画布
"""
canvas.saveState() # 先保存当前的画布状态
# pageNumber = ("--%s--" % canvas.getPageNumber()) # 获取当前的页码
pageNumber = ("选题指南")
stylesheet = getSampleStyleSheet()
stylesheet.add(ParagraphStyle(fontName='simhei', name='simhei', leading=12, fontSize=8))
p = Paragraph(pageNumber,stylesheet['simhei'])
w, h = p.wrap(200 , 100 ) # 申请一块1cm大小的空间,返回值是实际使用的空间
p.drawOn(canvas, 235, 810) # 将页码放在指示坐标处
canvas.restoreState()
def main():
#设置样式
stylesheet = getSampleStyleSheet()
stylesheet.add(ParagraphStyle(fontName='simhei', name='simhei', leading=15, fontSize=10,spaceAfter=6,spaceBefore=6))
stylesheet.add(ParagraphStyle(name='titledef',parent=stylesheet['Normal'],fontName = 'simhei',fontSize=18,leading=22,alignment=TA_CENTER,spaceAfter=6))
stylesheet.add(ParagraphStyle(name='head1def',parent=stylesheet['Normal'],fontName = 'simhei',fontSize=14,leading=18,spaceBefore=12,spaceAfter=6))
stylesheet.add(ParagraphStyle(name='head2def',parent=stylesheet['Normal'],fontName = 'simhei',fontSize=12,leading=14,spaceBefore=12,spaceAfter=6))
#定义容器
story = []
#添加内容,样式是标题
story.append(Paragraph("分析报告", stylesheet['titledef']))
#添加内容,样式是段落标题
story.append(Paragraph(u"一、主题概览", stylesheet['head1def']))
#添加图片
story.append('图片地址')
#添加普通内容
story.append(Paragraph('content', stylesheet['simhei']))
#保存
doc = SimpleDocTemplate('pdf/filename.pdf')
doc.build(story,onFirstPage=footer,onLaterPages=footer)