1.Python 修改excel文件

1
2
3
4
5
6
7
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文件,指定标签页,并写入内容到应标签页内

1
2
3
4
5
6
7
8
9
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

1
# pip install pdfminer3k
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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

1
# pip install pypdf2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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  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/

直接使用

1
pip  install  pillow

也可以安装模块

导入时使用 from PIL import Image

简单例子:

1
2
3
4
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

脚本:

1
2
3
4
5
6
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度后,在贴回图片上

1
2
3
4
5
6
7
8
9
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:缩放

1
2
3
4
5
6
7
8
9
10
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:验证码(已封装)

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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  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