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 方法复制一份出来再修改,最后保存或覆盖原文件。
#原表格内容
#改后表格内容
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"
)
|
执行结果:
打开hello1.xlsx
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
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/
直接使用
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 度角。
例一:抠图
图片:
脚本:
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"
)
|
抠取过程:
解释:上述代码将图片的((170, 0), (170, 260), (390, 0), (390, 260))所画出来的区域进行裁剪,并保存在cutting.jpg中
结果L:
史上最强驱逐舰,大家一起来感受一下~_(: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()
|
效果:
例子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)
|
对比一下:
缩放图:
例子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
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()
|
效果: