日常遇到的一些小问题,尝试着使用python的方式解决。

操作PDF文件

将多个pdf文件合成一个新的pdf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import PyPDF2

## 讲多个PDF合成一个PDF
# 将文件名收集一个list
def hec(filenames):
## 多个PDF合成一个PDF
# 将文件名收集一个list
merger = PyPDF2.PdfFileMerger()
for filename in filenames :
merger.append(PyPDF2.PdfFileReader(filename))

merger.write('新.pdf')
return
## 文件要放在程序的同一个目录里

给pdf文件加水印

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
def add_sy(filenames,sy):
for filename in filenames:
#二进制的形式打开pdf文件
with open(filename,'rb') as pdfFile:
#读取pdf文件
pdfReader = PyPDF2.PdfFileReader(pdfFile)
#取出第一页
minutesFirstPage = pdfReader.getPage(0) #取第一页

with open(sy,'rb') as markFile:
#二进制的形式打开水印文件,读取水印文件
pdfwaterReader = PyPDF2.PdfFileReader(markFile)
#将水印页面添加上
minutesFirstPage.mergePage(pdfwaterReader.getPage(0))
pdfWriter = PyPDF2.PdfFileWriter()
#生产新的文件
pdfWriter.addPage(minutesFirstPage)
#将剩余页面加入新文件
for pageNum in range(1,pdfReader.numPages):
#取得每一页的对象
pageObj = pdfReader.getPage(pageNum)
#加入新文件
pdfWriter.addPage(pageObj)
with open('new pdf.pdf','wb') as resultFile:
pdfWriter.write(resultFile)
#输出新文件
return

操作Excel

对当前表单的单元格的各种操作

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
import openpyxl
#打开一个exl文件
wb
print(wb.sheetnames)
#打印出所有表单项
for sheet in wb:
print(sheet.title)
## 增加表单项
#mySheet = wb.create_sheet('test_sheet')
#活跃的表单
active_ws = wb.active
print(active_ws)
### 选取特定的单元格
# print(active_ws['A1'].value)
# print(active_ws['B6'].value)
#打印出A1单元格的第几行第几列
b = active_ws['A1']
print('Row {},Colum {}'.format(b.row,b.column))
#打印出当前单元格和值
print('Cell {} is {}'.format(b.coordinate,b.value))
#另一种取出单元格
print(active_ws.cell(row=3,column=3).value)
# 打印出第1-8行的第3列
for i in range(1,8):
print(active_ws.cell(row=i,column=3).value)

colC = active_ws['C']
print("hhhhh",colC[2].value)

### 打印出3到5行A到C列的所有数据
row_range = active_ws[3:5]
col_range = active_ws['A:C']
for row in row_range:
for col in row:
print(col.value,end=' ')
print()
## 打印出表格是几乘几的
print('max row {},max column {}'.format(active_ws.max_row,active_ws.max_column))

对数据进行读取,并且保存成字典

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
import openpyxl,pprint
## 读取Excl文件
print("正打开excl")
wb = openpyxl.load_workbook('censuspopdata.xlsx')
#当前活跃的表单
sheet = wb.active
print("当前的表单:{}".format(sheet))
#初始化数据列表
InitData = {}
#因为第一行是标题。。看情况改
for row in range(2,sheet.max_row):
#取出每一行的每一个元素
data1=sheet['B'+str(row)].value
data2=sheet['C'+str(row)].value
data3=sheet['D'+str(row)].value
#setdefault函数当键值不存在的时候加入一个新的键
InitData.setdefault(data1,{})
InitData[data1].setdefault(data2,{'tract':0,'pop':0})
#不管存不存在 tract都加了1
InitData[data1][data2]['tract'] += 1
InitData[data1][data2]['pop'] += int(data3)
#保存数据
print('正在保存文件。。')
## 将数据保存在一个py文件里
resul = open('cen2010.py','w')
## 输出成字典
resul.write('allData = '+pprint.pformat(InitData))

保存新的文件

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
#新建一个ex
wb = openpyxl.Workbook()
#设置表单名和索引
wb.create_sheet(index=0,title='first')
wb.create_sheet(index=1,title='second')
#取第二个表单
sheet = wb['second']
#删除第二个表单
wb.remove(sheet)
#保存为新的表单
wb.save('hhhh.xlsx')

######################
import openpyxl
wb = openpyxl.Workbook()
ws1 = wb.create_sheet(index=0,title='test')
list = [[1,2,3],
[2,3,4],
[5,6,7]]
#可以将整个列表写入到表格
for l in list:
#append可以一次性将整个列表加入到表格的一行留
ws1.append(l)

wb.save('test.xlsx')

#######################
#对一定区间的每个单元格进行操作
for col in range(1,100):
for row in range(1,100):
ws1.cell(column=col,row=row,value=col*row)

一个小demo-统计计算全校各学院男女平均身高,并且生成图表

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import openpyxl
from openpyxl.chart import BarChart,Reference,BarChart3D
#定义数据结构
'''
data = {
学院:{
男:{男生人数,身高},
女:{女生人数,身高 }
}
'''

print("正在打开文件")
wb = openpyxl.load_workbook('test.xlsx')
sheet = wb.active
data = {}
print("开始统计")
for i in range(6,sheet.max_row):
xueyuan = sheet['E'+str(i)].value
sex = sheet['D'+str(i)].value
hight = sheet['F'+str(i)].value
weight = sheet['G'+str(i)].value
data.setdefault(xueyuan,{})
data[xueyuan].setdefault(sex,{'num':0,'ah':0,'aw':0})
data[xueyuan][sex]['num'] += 1
data[xueyuan][sex]['ah'] +=float(hight)
data[xueyuan][sex]['aw'] +=float(weight)
print("稍等一下,马上出数据")
for i in data.keys():
for j in data[i].keys():
data[i][j]['ah'] = data[i][j]['ah'] / data[i][j]['num']
data[i][j]['aw'] = data[i][j]['aw'] / data[i][j]['num']
# print("{} {}生有 {} 人,平均身高 {} ,平均体重 {}".format(i,j,data[i][j]['num'],data[i][j]['ah'],data[i][j]['aw']))
print("即将将数据填入表格")
lis_m = []
lis_w = []
list2 = []
list2.append('学院')
list2.append('人数')
list2.append('平均身高')
list2.append('平均体重')
lis_m.append(list2)
lis_w.append(list2)
for list1 in data.keys():
list3 = list(data[list1]['男'].values())
list3.insert(0,list1)
lis_m.append(list3)
list4=list(data[list1]['女'].values())
list4.insert(0, list1)
lis_w.append(list4)
print("将数据填成表格中")
wb = openpyxl.Workbook()
sheet = wb.create_sheet(index=0,title='test')
sheet.append(['男生'])
for i in lis_m:
sheet.append(i)
sheet.append(['女生'])
for i in lis_w:
sheet.append(i)
print("表格生成完成,开始绘制图表。。。")

chart1 = BarChart()

chart1.type='col'
chart1.style = 10
chart1.title = '男生'
chart1.y_axis.title='身高体重'
chart1.x_axis.title='学院'

cats = Reference(sheet,min_col=1,min_row=2,max_row=18)
data2 = Reference(sheet,min_col=3,max_col=4,min_row=3,max_row=18)
chart1.add_data(data=data2,titles_from_data=True)
chart1.set_categories(cats)
sheet.add_chart(chart1,'G1')
chart2 = BarChart()
chart2.type='col'
chart2.style = 10
chart2.y_axis.title='身高体重'
chart2.x_axis.title='学院'
chart2.title = '女生'
cats = Reference(sheet,min_col=1,min_row=21,max_row=36)
data3 = Reference(sheet,min_col=3,max_col=4,min_row=21,max_row=36)
chart2.add_data(data=data3,titles_from_data=True)
chart2.set_categories(cats)
sheet.add_chart(chart2,'G20')
print("开始生成新文件。。。")
wb.save('new.xlsx')
print("完成!")

使用python发送QQ邮件(简单版)

还不可以添加附件和图片等。。

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
import smtplib
from email.mime.text import MIMEText
from email.header import Header
'''
发送qq邮件模块,
from_addr 发送人邮箱
from_pwd 授权码
to_addr 收信人邮箱
'''
def send_Email(text,from_addr,from_pwd,to_addr,msg):
_from_email = from_addr
_from_pwd = from_pwd
_to_addr_ = to_addr
smtp_srv = 'smtp.qq.com'
try:
#连接上邮箱服务器
srv = smtplib.SMTP_SSL(smtp_srv, 465)
srv.login(_from_email, _from_pwd)
srv.sendmail(_from_email, _to_addr_, msg.as_string())
srv.quit()
except Exception as e:
print('something error', e)
##建立邮件格式
def build_Text(text='',From='',title='',To=''):
msg = MIMEText(text,'plain','utf-8')
#发件人
msg['From']= Header(From)
#收件人
msg['To'] = Header(To)
#标题
msg['Subject']=Header(title,'utf-8')
return msg
if __name__=='__main__':
From = input('填写发件人名字:\t')
From_addr = input('填写发件人邮箱:\t')
To = input('填写收件人名字:\t')
To_addr = input('填写收件人邮箱:\t')
Title = input('填写邮件标题:\t')
Text = input('填写邮件正文:\n')
from_pwd='poxajievgyfmbaif'
print('正在发送邮件。。。。')
try:
msg = build_Text(text=Text,From=From,title=Title,To=To)
send_Email(text=Text,from_addr=From_addr,from_pwd=from_pwd,to_addr=To_addr,msg=msg)
print("邮件发送成功!")
except Exception as e:
print("邮件发送失败:",e)