前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >51. Python 数据处理(2)

51. Python 数据处理(2)

作者头像
py3study
发布2020-01-10 00:28:57
5840
发布2020-01-10 00:28:57
举报
文章被收录于专栏:python3python3

1.Python 修改excel文件

代码语言:javascript
复制
import xlrd
import xlutils.copy
excelr = xlrd.open_workbook("hello.xlsx")
excelw = xlutils.copy.copy(excelr)
sheet1 = excelw.get_sheet(0)
sheet1.write(3, 5, "xlutils.copy test test")
excelw.save("hello.xlsx") 	# 这里如果名称不变,则覆盖原文件,如果名称改变,则生成新名称的文件。

#所以,由上代码可以分析出,如果文件原本就存在,而你要修改它,不能直接使用xlwt,必须使用 xlutils.copy 方法复制一份出来再修改,最后保存或覆盖原文件。

#原表格内容

image.png
image.png

#改后表格内容

image.png
image.png

2. python 创建新的excel文件,指定标签页,并写入内容到应标签页内

代码语言:javascript
复制
import xlwt
excel = xlwt.Workbook("hello.xlsx")
sheet1 = excel.add_sheet("sheet5")
sheet2 = excel.add_sheet("sheet2")
sheet3 = excel.add_sheet("sheet3")
sheet1.write(0,0,"hello world")
sheet2.write(1,0,"hello")
sheet3.write(2,0,"test test")
excel.save("hello1.xlsx")

执行结果:

image.png
image.png

打开hello1.xlsx

image.png
image.png

3.处理pdf文件

(1) 读取pdf文件

python3 安装 pdfminer3k

代码语言:javascript
复制
# pip install pdfminer3k
代码语言:javascript
复制
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("C:\\Users\\Shinelon\\PycharmProjects\\Python3\\datachuli\\aminglinux\\chapter1.pdf","rb")
#创建一个与文档相关联的解释器
parser=PDFParser(fp)
doc=PDFDocument()
parser.set_document(doc)
doc.set_parser(parser)
#PDF文档对象,提供密码初始化,没有就不用带password参数。
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())

(2)合并多个pdf文件为一个pdf文件

安装pypdf2

代码语言:javascript
复制
# pip install pypdf2
代码语言:javascript
复制
import PyPDF2
import os


# 建立一个装pdf文件的数组
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
"""这种方法获取的文件名列表是按照ascii码排序的,例如:chapter1.pdf,chapter10.pdf,chapter11.pdf...以此类推"""
# for fileName in os.listdir(r'C:\Users\Shinelon\PycharmProjects\Python3\datachuli\aminglinux'):  # 遍历该程序所在文件夹内的文件
#     if fileName.endswith('.pdf'):  # 找到以.pdf结尾的文件
#         pdfFiles.append(fileName)  # 将pdf文件装进pdfFiles数组内
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

"""这种方式可以采用,但是应该还有更好的方法,再想想"""
pdfFiles = []
for i in range(1, 27):
    pdfFiles.append("chapter{0}.pdf".format(i))
    
os.chdir(r"C:\Users\Shinelon\PycharmProjects\Python3\datachuli\aminglinux")
pdfWriter = PyPDF2.PdfFileWriter()  # 生成一个空白的pdf文件

for pdf in pdfFiles:
    pdfReader = PyPDF2.PdfFileReader(open(pdf, '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()

3.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/

直接使用

代码语言:javascript
复制
pip install pillow

也可以安装模块

导入时使用 from PIL import Image

简单例子:

代码语言:javascript
复制
from PIL import Image
image = Image.open("img.jpg")
print (image.format, image.size, image.mode)
image.show()

结果:

JPEG (580, 326) 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 度角。

例一:抠图

图片:

img.jpg
img.jpg

脚本:

代码语言:javascript
复制
from PIL import Image
image = Image.open("img.jpg")
print(image.format, image.size, image.mode)
box = (170, 0, 390, 260)
region = image.crop(box)
region.save("cutting.jpg")

抠取过程:

clipboard.png
clipboard.png

解释:上述代码将图片的((170, 0), (170, 260), (390, 0), (390, 260))所画出来的区域进行裁剪,并保存在cutting.jpg中

结果L:

image.png
image.png

史上最强驱逐舰,大家一起来感受一下~_(:3 」∠)_

例子2:图片拼合

将图片抠出来,旋转180度后,在贴回图片上

代码语言:javascript
复制
from PIL import Image
image = Image.open("img.jpg")
print(image.format, image.size, image.mode)
box = (170, 0, 390, 260)
egion = image.crop(box)
egion.save("cutting.jpg")
region = egion.transpose(Image.ROTATE_180)
image.paste(region, box)
image.show()

效果:

image.png
image.png

例子3:缩放

代码语言:javascript
复制
from PIL import Image
infile = "img.jpg"
outfile = "img2.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()
out.save(outfile)

对比一下:

image.png
image.png

缩放图:

image.png
image.png

例子4:验证码(已封装)

代码如下:

代码语言:javascript
复制
import random
import string
from PIL import Image, ImageDraw, ImageFont, ImageFilter


class VerCode(object):
    def __init__(self):
        # 字体的位置,不同版本的系统会有不同
        self.font_path = 'consolai.ttf'
        # 生成几位数的验证码
        self.number = 4
        # 生成验证码图片的高度和宽度
        self.size = (100, 30)
        # 背景颜色,默认为白色
        self.bgcolor = (255, 255, 255)
        # 字体颜色,默认为蓝色
        self.fontcolor = (0, 0, 255)
        # 干扰线颜色。默认为红色
        self.linecolor = (255, 0, 0)
        # 是否要加入干扰线
        self.draw_line = True
        # 加入干扰线条数的上下限
        self.line_number = 20


    # 用来随机生成一个字符串
    def gene_text(self):
        self.source = list(string.ascii_letters)
        for self.index in range(0, 10):
            self.source.append(str(self.index))
        return ''.join(random.sample(self.source, self.number))  # number是生成验证码的位数


    # 用来绘制干扰线
    def gene_line(self, draw, width, height):
        self.begin = (random.randint(0, width), random.randint(0, height))
        self.end = (random.randint(0, width), random.randint(0, height))
        draw.line([self.begin, self.end], fill=self.linecolor)


    # 生成验证码
    def gene_code(self):
        self.width, self.height = self.size  # 宽和高
        self.image = Image.new('RGBA', (self.width, self.height), self.bgcolor)  # 创建图片
        self.font = ImageFont.truetype(self.font_path, 25)  # 验证码的字体
        self.draw = ImageDraw.Draw(self.image)  # 创建画笔
        self.text = self.gene_text()                 # 生成字符串
        self.font_width, self.font_height = self.font.getsize(self.text)
        self.draw.text(((self.width - self.font_width) / self.number, (self.height - self.font_height) / self.number), self.text, font=self.font, fill=self.fontcolor)  # 填充字符串
        if self.draw_line:
            for i in range(self.line_number):
                self.gene_line(self.draw, self.width, self.height)
    def effect(self):
        #self.image = self.image.transform((self.width + 20, self.height + 10), Image.AFFINE, (1, -0.3, 0, -0.1, 1, 0), Image.BILINEAR)  # 创建扭曲
        self.image = self.image.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 滤镜,边界加强
        self.image.save('idencode.png')  # 保存验证码图片
        #self.image.show()


if __name__ == "__main__":
    vco = VerCode()
    vco.gene_code()
    vco.effect()

效果:

image.png
image.png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档