文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

51. Python 数据处理(2)

2023-01-31 06:05

关注

1.Python 修改excel文件

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


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

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


打开hello1.xlsx

image.png


3.处理pdf文件

(1) 读取pdf文件

python3 安装 pdfminer3k

# pip install pdfminer3k
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

# pip install pypdf2
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/

直接使用

pip install pillow

也可以安装模块

导入时使用 from PIL import Image

简单例子:

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

脚本:

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

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


结果L:

image.png

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



例子2:图片拼合

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

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


例子3:缩放

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


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

代码如下:

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯