一、PDF模块
使用PyPDF2模块
pip install PyPDF2
1.1 从PDF读取数据
直接读取,并打印出来。但是这种打印存在一个问题,不能中文字符
import PyPDF2
import os
pdf_obj = open(\'de8ug.pdf\', \'rb\') # 使用二进制方式打开,生成一个文件对象
pdf = PyPDF2.PdfFileReader(pdf_obj) # 把文件对象传入到pdfread中
print(pdf.numPages) # 获取pdf的页数
page = pdf.getPage(1) # 获取PDF某一页内容,生产一个对象
print(page.extractText()) # 打印出来,但是存在一个问题,不能显示中文
解决中文字符的问题
import os
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
# 资源管理 # 运行过程
from pdfminer.converter import TextConverter # 文本转换
from pdfminer.layout import LAParams # 布局
from io import StringIO # 临时文件
def convert_pdf(path):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, laparams=laparams) # 把几个对象传入进来,生产文本转换对象
fp = open(path, \'rb\')
process_pdf(rsrcmgr, device, fp) # 转换的过程,转移到临时文件中
fp.close()
device.close()
out = retstr.getvalue() # 直接到临时文件中读取数据
retstr.close()
return out
s = convert_pdf(\'de8ug.pdf\')
s.split(\'\n\x0c\') # 每一页都是根据这个进行分割的
1.2 写入PDF
从某一个PDF中获取某一页写入到新的一个PDF中
import PyPDF2
pdf_writer = PyPDF2.PdfFileWriter() # 先生成一个写对象
# 生成一个读对象,并获取指定某一页码
pdf_obj = open(\'de8ug.pdf\', \'rb\')
pdf = PyPDF2.PdfFileReader(pdf_obj)
page = pdf.getPage(1)
# 在写对象中加入这一夜
pdf_writer.addPage(page)
# 打开一个文件,写入内容
with open(\'lh-1.pdf\', \'wb\') as f:
pdf_writer.write(f)
pdf_obj.close()
1.3 PDF 加密与解密
加密
with open(\'debug.pdf\', \'rb\') as f:
# 打开需要加密文件,使用文件对象生成一个PDF_read对象
pdf_read = PyPDF2.PdfFileReader(f)
# 生成一个pdf写对象
pdf_write = PyPDF2.PdfFileWriter()
# 循环每一页,把read对象中的每一页,加入到write对象中
for page in range(pdf.numPages):
pdf_write.addPage(pdf.getPage(page))
# 对read对象进行加密
pdf_write.encrypt(\'hilouhui\')
# 直接写入到文本中
with open(\'lh-en.pdf\', \'wb\') as f2:
pdf_write.write(f2)
解密:
import PyPDF2 with open(\'lh-en.pdf\', \'rb\') as f: pdf_read = PyPDF2.PdfFileReader(f) print(pdf_read.isEncrypted) # 判读是否加密,这个只是read对象的方法 pdf_read.decrypt(\'hilouhui\') # 解密 # print(pdf_read.getPage(1).extractText()) page = pdf_read.getPage(1) print(page.extractText())
1.4 加水印
加水印的原理其实就是多个pdf的合并
import PyPDF2 with open(\'de8ug.pdf\', \'rb\') as f_in: with open(\'water.pdf\', \'rb\') as f_out: # 打开两个pdf 对对象: pdf_in = PyPDF2.PdfFileReader(f_in) pdf_out = PyPDF2.PdfFileReader(f_out) # 打开一个写的PDF对象 pdf_write = PyPDF2.PdfFileWriter() # 里面那层每一页读取出来,实用水印页进行合并。在写到pdf_write中 for page_num in range(pdf_in.numPages): page = pdf_in.getPage(page_num) page.mergePage(pdf_out.getPage(0)) # 对每一页进行合并 pdf_write.addPage(page) # 写入文件 with open(\'de8ug-water.pdf\', \'wb\') as f: pdf_write.write(f)
1.4 将数据导出为PDF格式
import datetime # 导入日期时间库 import reportlab.pdfbase.ttfonts # 导入reportlab的注册字体 reportlab.pdfbase.pdfmetrics.registerFont( reportlab.pdfbase.ttfonts.TTFont(\'song\', \'C:\WINDOWS\Fonts\simsun.ttc\')) # 注册字体,linux和windowns不同 from reportlab.pdfgen import canvas from reportlab.lib.units import inch # 导入单位英寸 def create_pdf(input, output="disosi.pdf"): now = datetime.datetime.today() date = now.strftime("%h %d %Y %H:%M:%S") # 设定日期格式 c = canvas.Canvas(output) c.setFont(\'song\', 10) # 设置字体字号 textobject = c.beginText() # 定义开始 textobject.setTextOrigin(inch, 11 * inch) # 定义位置 textobject.textLines(\'\'\'LH备忘录: %s \'\'\' % date) # 输出标题 for line in input: # 通过循环的方式一行一行写入文件 textobject.textLine(line.strip()) # 写入文件 c.drawText(textobject) c.showPage() c.save() def main(): report = [\'我是娄辉\', \'你呢\', \'我很帅\'] create_pdf(report) if __name__ == \'__main__\': main()
二、 Excel 表格操作
python操作excel使用openpyxl这个模块,其中有三个对象:
- workbook 工作簿,一个excle文件
- sheet 表格,一个excle文件中包含多个表格
- cell 单元格
excel的操作的情景:
- 打开或者创建一个Excel需要创建一个Workbook对象
- 获取一个表则需要先创建一个Workbook对象,然后使用该对象的方法来得到一个Worksheet对象
- 如果要获取表中的数据,那么得到Worksheet对象以后再从中获取代表单元格的Cell对象
2.1 三个对象操作
2.1.1 workbook对象
打开与 保存方法:
import openpyxl wb = openpyxl.load_workbook(\'de8ug.xlsx\') # 打开文件,加载到wb的内存处 wb.save(\'lh.xlsx\') # 保存成另外一个文件
import openpyxl
wb = openpyxl.load_workbook(\'de8ug.xlsx\')
wb.active # 获取当前活跃的sheet,默认打开第一张活跃
wb.sheetnames # 获取所有的表名
wb.worksheets # 以列表的方式返回所有的worksheet对象
wb.get_sheet_by_name(\'表名\') # 获取一个表对象。但是这种方法现在不用了
wb[\'name\'] # 使用这种方法获取表对象
wb.read_only # 判断是否只读
wb.encoding # 获取字符编码
wb.properties # 获取文件的信息,编码,时间,创建者等等
wb.get_sheet_names # 获取所有表格的名称(新版已经不建议使用,通过Workbook的sheetnames属性即可获取)
get_sheet_by_name # 通过表格名称获取Worksheet对象(新版也不建议使用,通过Worksheet[‘表名‘]获取)
get_active_sheet # 获取活跃的表格(新版建议通过active属性获取)
remove_sheet # 删除一个表格
create_sheet # 创建一个空的表格
copy_worksheet # 在Workbook内拷贝表格
2.1.2 worksheet对象 表对象
# 属性
title: 表格的标题
dimensions: 表格的大小,这里的大小是指含有数据的表格的大小,即:左上角的坐标:右下角的坐标
max_row: 表格的最大行
min_row: 表格的最小行
max_column: 表格的最大列
min_column: 表格的最小列
rows: 按行获取单元格(Cell对象) - 生成器
columns: 按列获取单元格(Cell对象) - 生成器
freeze_panes: 冻结窗格
values: 按行获取表格的内容(数据) - 生成器
# 方法
iter_rows: 按行获取所有单元格,内置属性有(min_row,max_row,min_col,max_col)
iter_columns: 按列获取所有的单元格
append: 在表格末尾添加数据
merged_cells: 合并多个单元格
unmerged_cells: 移除合并的单元格
2.1.3 cell对象 单元格对象
cell对象的方法比较简单:
获取单元格对象的两种方式:
sh1 [\'a1\']
sh1.cell(row=1, column=2)
row: 单元格所在的行
column: 单元格坐在的列
value: 单元格的值,可以直接获取。 cell1.value = \'改变的值\' 也可以 cell1 = \'改变的值\'
coordinate: 单元格的坐标
2.1.4 函数 与 单元格样式
添加函数其实就是 添加字符串,加上去后,让excel自动解析:
例如: =AVERAGE(B2:B8)
单元格样式:
from openpyxl.styles import Font # 内置很多种样式 font = Font(bold=True, size=20) # 字体样式有很多方法 sh2[\'B7\'].font = font
2.2 一些小case
import openpyxl wb = openpyxl.load_workbook(\'de8ug.xlsx\') sh1 = wb.active sh2 = wb[\'Sheet2\'] sh2[\'a1\'] = \'名字\' sh2[\'b1\'] = \'分数大于75\' index = 2 for row in sh1.rows: # 利用rows的生成器对象 # print(row) # print(row[0].value,row[1].value) if row[0].coordinate != \'A1\' and row[1].value > 75: sh2[\'A\' + str(index)] = row[0].value sh2[\'B\' + str(index)] = row[1].value index += 1 wb.save(\'111111111111.xlsx\')
import openpyxl wb = openpyxl.load_workbook(\'de8ug.xlsx\') sh1 = wb[\'成绩表\'] sh2 = wb[\'Sheet2\'] index = 2 for row in range(2, sh1.max_row+1): grade = sh1.cell(row=row, column=2).value if grade > 75: sh2[\'A\' + str(index)] = sh1.cell(row=row, column=1).value sh2[\'B\' + str(index)] = grade index += 1 wb.save(\'22222.xlsx\')