Python办公自动化之文件读写操作与Excel,csv,PDF文件
文件读写与异常处理
使用open()
函数打开文件,并且可以通过函数里的参数指定文件名、操作模式、字符编码等。
常用操作模式如下表:
操作模式 | 具体含义 |
---|---|
'r'
|
读取 (默认) |
'w'
|
写入(会先截断之前的内容) |
'x'
|
写入,如果文件已经存在会产生异常 |
'a'
|
追加,将内容写入到已有文件的末尾 |
'b'
|
二进制模式 |
't'
|
文本模式(默认) |
'+'
|
更新(既可以读又可以写) |
如果想了解更多的操作模式,可点击此链接:菜鸟教程之file
在读取文件之后如果无法对自己程序的操作模式进行确定,可参考下图:
通过open函数打开一个文件之后,我们会得到一个返回文件对象,通过这个文件对象,我们可以实现对文件的读写操作。在使用完之后,我们一定要关闭文件,释放资源。关闭文件操作是close()
。
文件对象的操作函数
file.close()
关闭文件。关闭后文件不能再进行读写操作。
file.flush()
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.fileno()
返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
file.read([size])
从文件读取指定的字节数,如果未给定或为负则读取所有。
file.readline([size])
读取整行,包括 “\n” 字符。
file.readlines([sizeint])
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
file.seek(offset[, whence])
移动文件读取指针到指定位置
file.tell()
返回文件当前位置。
file.truncate([size])
从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小。
file.write(str)
将字符串写入文件,返回的是写入的字符长度。
file.writelines(sequence)
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
open函数的参数
open函数的完整的语法格式
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明
file
: 必需,文件路径(相对或者绝对路径)。
mode
: 可选,文件打开模式
buffering
: 设置缓冲
encoding
: 一般使用utf8
errors
: 报错级别
newline
: 区分换行符
closefd
: 传入的file参数类型
opener
: 设置自定义开启器,开启器的返回值必须是 一个打开的文件描述符。
这里介绍一个小绝招:当我们使用open函数时,每次在不用文件时都需要使用close()函数关闭文件,会很麻烦。所以我们一般都不会使用这种方式,推荐大家使用:with open() as 别名:这种方式,这种方式会在我们使用完文件之后,自动帮助我们关闭文件,继而我们后续就不需要手动输入代码关闭文件。
读写文本文件
读文件
使用open函数打开一个文件,一般来说都会指定操作模式,如果不指定,默认是读模式,'r’
# 返回的是全部的歌词
with open('周杰伦-青花瓷.txt','r',encoding='utf-8') as file:print(file.read())
也可以使用for-in循环逐行读取,也可以使用readlines将文件按行读取到容器中。
with open('周杰伦-青花瓷.txt','r',encoding='utf-8')as file:# print(file.read())for line in file:print(line,end='')lines = file.readlines() # lines是一个列表for line in lines:print(line,end='')
readlines:读取多行(全部)
readline:读一行
with open('周杰伦-青花瓷.txt','r',encoding='utf-8')as file:print(file.readline())
写文件
如果需要向文件中写入内容,可以指定操作模式为’w’或者a,'w’模式写入内容会覆盖之前的内容,'a’是在内容的尾部追加新内容。
with open('周杰伦-青花瓷.txt','a',encoding='utf-8')as file:file.write('\n歌曲:青花瓷')file.write('\n演唱:周杰伦')
异常处理
在编写程序时,很多时候报错是很普遍的,但是很多时候我们不想要程序报错,哪怕真的报错了,也希望下面的代码也可以继续执行,而不是停留在报错行,通常使用异常机制对这些问题进行处理。
对于异常处理,与之相关的关键字有try
,except
,else
,finally
,raise
。
对于异常处理,有以下几种方式:
try..except
try...except...else
try...except...else...finally
raise触发异常
x = 6
if x > 1:raise Exception('x 不能大于 1。x : {}'.format(x))# 返回
Exception: x 不能大于 1。x : 6
读写二进制文件
读写二进制文件的操作与上面的读写文件基本相同,只是将open函数的操作模式改变一下。
读二进制文件:操作模式----->'rb'
写二进制文件:操作模式----->'wb'
只要涉及二进制文件:往往都是在操作模式后面加上‘b’。
python读取csv文件
CSV文件介绍
CSV(Comma Separated Values)全称逗号分隔值文件是一种简单、通用的文件格式,被广泛的应用于应用程序(数据库、电子表格等)数据的导入和导出以及异构系统之间的数据交换。因为CSV是纯文本文件,不管是什么操作系统和编程语言都是可以处理纯文本的,而且很多编程语言中都提供了对读写CSV文件的支持,因此CSV格式在数据处理和数据科学中被广泛应用。
CSV文件有以下特点:
- 纯文本,使用某种字符集(如ASCII、Unicode、GB2312)等);
- 由一条条的记录组成(典型的是每行一条记录);
- 每条记录被分隔符(如逗号、分号、制表符等)分隔为字段(列);
- 每条记录都有同样的字段序列。
将数据写入csv文件
在进行csv文件操作是需要调用Python中的csv模块,该模块的writer
函数会返回一个csvwriter
对象,通过该对象的writerow
或writerows
方法就可以将数据写入到CSV文件中。
import csv
import random
# 如果文件存在则直接在里面添加,否则创建文件之后再进行添加
with open('scores.csv','w',encoding='utf-8',newline='')as file:writer = csv.writer(file)# 写入表头writer.writerow(['name','chinese','math','english'])names = ['刘备','关羽','张飞']for i in range(3):# 使用随机生成成绩chinese_score = random.randint(40,100)math_score = random.randint(40,100)english_score = random.randint(40,100)# 写入名字和成绩writer.writerow([names[i],chinese_score,math_score,english_score])
上面的
writer
函数,该函数除了传入要写入数据的文件对象外,还可以dialect
参数,它表示CSV文件的方言,默认值是excel
。除此之外,还可以通过delimiter
、quotechar
、quoting
参数来指定分隔符(默认是逗号)、包围值的字符(默认是双引号)以及包围的方式。其中,包围值的字符主要用于当字段中有特殊符号时,通过添加包围值的字符可以避免二义性
示例:
import csvwith open('scores.csv', 'r') as file:reader = csv.reader(file, delimiter='|')for line in reader:print(reader.line_num, end='\t')for elem in line:print(elem, end='\t')print()
Excel操作
Python操作Excel需要三方库的支持,如果要兼容Excel 2007以前的版本,也就是xls
格式的Excel文件,可以使用三方库xlrd
和xlwt
,前者用于读Excel文件,后者用于写Excel文件。如果使用较新版本的Excel,即操作xlsx
格式的Excel文件,也可以使用openpyxl
库,当然这个库不仅仅可以操作Excel,还可以操作其他基于Office Open XML的电子表格文件。
使用xlrd读Excel文件
xlrd读取的是xls文件,如果需要使用它读xlsx文件,新版本的xlrd不支持,我们需要下载的版本是1.2.0版本的。
具体xlrd的读文件操作以代码形式展示:
import xlrd# 工作簿--->一个Excel文件---->workbook
wb = xlrd.open_workbook('阿里巴巴2020年股票数据1.xls')
# 获取所有工作表
print(wb.sheet_names())
# 获取指定工作表,worksheet
sheet = wb.sheet_by_name('股票数据')
sheet1 = wb.sheet_by_index(0)
print(type(sheet),type(sheet1))
# # 获取行数列数
print(sheet.nrows,sheet.ncols)
# # 获取单元格的数据
print(sheet.row(0)) # 一行
print(sheet.row(0)[0]) #第一行中某一个具体的数据
print('---------------------')
# 指定某行从第几列输出到第几列
print(sheet.row_slice(1,start_colx=0,end_colx=3))
print(sheet.col(1))
print(sheet.col_slice(4, start_rowx=1, end_rowx=11))# 获取单元格数据--->cell--->value
cell = sheet.cell(2, 2)
print(cell.value)
# 遍历表单,根据行列索引,不包括表头
print(f'交易日期\t\t\t最高价\t\t最低价\t\t开盘价\t\t收盘价\t\t成交量\t\t调整收盘价')
for row in range(1, sheet.nrows):for col in range(sheet.ncols):value = sheet.cell(row, col).valueif col == 0:# 处理时间日期# year, month, date, *_ = xlrd.xldate_as_tuple(value, 0)curr_date = xlrd.xldate_as_datetime(value,0)print(curr_date.strftime('%Y年%m月%d日'),end='\t')# print(f'{year}年{month:0>2d}月{date:0>2d}日', end='\t')elif col == 5:print(f'{int(value):<10d}', end='\t')else:print(f'{value:.4f}', end='\t')print()
xlwt写Excel文件
import randomimport xlwtstudent_names = ['关羽', '张飞', '赵云', '马超', '黄忠']
scores = [[random.randint(40, 100) for _ in range(3)] for _ in range(5)]
# 创建工作簿对象(Workbook)
wb = xlwt.Workbook()
# 创建工作表对象(Worksheet)
sheet = wb.add_sheet('一年级二班')
# 添加表头数据
titles = ('姓名', '语文', '数学', '英语')
for index, title in enumerate(titles):sheet.write(0, index, title)
# 将学生姓名和考试成绩写入单元格
for row in range(len(scores)):sheet.write(row + 1, 0, student_names[row])for col in range(len(scores[row])):sheet.write(row + 1, col + 1, scores[row][col])
# 保存Excel工作簿
wb.save('考试成绩表.xls')
调整单元格样式
背景色调整
第一行的表头单元格修改为黄色
header_style = xlwt.XFStyle()
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
# 0 - 黑色、1 - 白色、2 - 红色、3 - 绿色、4 - 蓝色、5 - 黄色、6 - 粉色、7 - 青色
pattern.pattern_fore_colour = 5
header_style.pattern = pattern
titles = ('姓名', '语文', '数学', '英语')
for index, title in enumerate(titles):sheet.write(0, index, title, header_style)
修改字体
font = xlwt.Font()
# 字体名称
font.name = '华文楷体'
# 字体大小(20是基准单位,18表示18px)
font.height = 20 * 18
# 是否使用粗体
font.bold = True
# 是否使用斜体
font.italic = False
# 字体颜色
font.colour_index = 1
header_style.font = font
表头垂直居中对齐
align = xlwt.Alignment()
# 垂直方向的对齐方式
align.vert = xlwt.Alignment.VERT_CENTER
# 水平方向的对齐方式
align.horz = xlwt.Alignment.HORZ_CENTER
header_style.alignment = align
调整行高列宽
# 设置行高为40px
sheet.row(0).set_style(xlwt.easyxf(f'font:height {20 * 40}'))
titles = ('姓名', '语文', '数学', '英语')
for index, title in enumerate(titles):# 设置列宽为200pxsheet.col(index).width = 20 * 200# 设置单元格的数据和样式sheet.write(0, index, title, header_style)
xlrd,xlwt这两个模块将Excel的读写操作是分开的,在进行文件操作时有点麻烦,所以推荐大家使用另一个Excel文件操作模块 openpyxl,它的功能和xlrd,xlwt相差不大,甚至强于他们,它将文件读写操作合并在一起,调用这个模块就可以对文件进行读写,同时都支持调整字体,颜色,对齐方式等,基本上excel的功能都有。
详细操作大家可以去官方API查看:
xlrd官方文档
xlwt官方文档
转载 openpyxl常用API
操作PDF文件
对PDF操作需要借助三方库PyPDF2
对PDF进行文字提取其实效率并不高,这里不做讲解。创建PDF亦是如此,这里只是讲一下如何给PDF添加水印以及对PDF加密。
添加水印、进行加密
在进行添加水印,我们需要准备另一个水印的PDF文件,其实添加水印实际上就是将两个PDF文件合在一起。
import PyPDF2
import os
from PyPDF2.pdf import PageObject
path = 'pdffile' # 当前PDF所在的路径,这里是相对于我的工作路径
filenames = os.listdir(path)
# 读取水印PDF文件
reader1 = PyPDF2.PdfFileReader('watermark.pdf')
# 水印在第一页,就只拿第一页
watermark_page = reader1.getPage(0)
# 创建一个PDF对象
writer = PyPDF2.PdfFileWriter()
# 将文件夹里面的所有PDF文件读取
for filename in filenames:reader2 = PyPDF2.PdfFileReader(path+'/'+filename)for page in range(reader2.numPages):curr_page = reader2.getPage(page) # type: PageObject# 将需要添加水印的PDF文件与水印文件合并curr_page.mergePage(watermark_page)# 创建PDF,将加了水印的PDF写在另一个创建的PDF里面writer.addPage(curr_page)# 给PDF加密,括号里面的是密码,相反decrypt()是解密,括号里面是密码writer.encrypt('123abc')# 保存文件with open(f'pdffile/{filename[:-4]}_watermark.pdf','wb')as file:writer.write(file)
我这里是对多个文件进行操作,对一个一是这种操作
正则表达式
正则表达式理解起来不容易,这里不做陈述。
转载:30分钟了解正则表达式
符号 | 解释 | 示例 | 说明 |
---|---|---|---|
.
|
匹配任意字符 |
b.t
|
可以匹配bat / but / b#t / b1t等 |
\w
|
匹配字母/数字/下划线 |
b\wt
|
可以匹配bat / b1t / b_t等 但不能匹配b#t |
\s
|
匹配空白字符(包括\r、\n、\t等) |
love\syou
|
可以匹配love you |
\d
|
匹配数字 |
\d\d
|
可以匹配01 / 23 / 99等 |
\b
|
匹配单词的边界 |
\bThe\b
|
|
^
|
匹配字符串的开始 |
^The
|
可以匹配The开头的字符串 |
$
|
匹配字符串的结束 |
.exe$
|
可以匹配.exe结尾的字符串 |
\W
|
匹配非字母/数字/下划线 |
b\Wt
|
可以匹配b#t / b@t等 但不能匹配but / b1t / b_t等 |
\S
|
匹配非空白字符 |
love\Syou
|
可以匹配love#you等 但不能匹配love you |
\D
|
匹配非数字 |
\d\D
|
可以匹配9a / 3# / 0F等 |
\B
|
匹配非单词边界 |
\Bio\B
|
|
[]
|
匹配来自字符集的任意单一字符 |
[aeiou]
|
可以匹配任一元音字母字符 |
[^]
|
匹配不在字符集中的任意单一字符 |
[^aeiou]
|
可以匹配任一非元音字母字符 |
*
|
匹配0次或多次 |
\w*
|
|
+
|
匹配1次或多次 |
\w+
|
|
?
|
匹配0次或1次 |
\w?
|
|
{N}
|
匹配N次 |
\w{3}
|
|
{M,}
|
匹配至少M次 |
\w{3,}
|
|
{M,N}
|
匹配至少M次至多N次 |
\w{3,6}
|
|
|
|
分支 |
foo|bar
|
可以匹配foo或者bar |
(?#)
|
注释 | ||
(exp)
|
匹配exp并捕获到自动命名的组中 | ||
(?<name>exp)
|
匹配exp并捕获到名为name的组中 | ||
(?:exp)
|
匹配exp但是不捕获匹配的文本 | ||
(?=exp)
|
匹配exp前面的位置 |
\b\w+(?=ing)
|
可以匹配I’m dancing中的danc |
(?<=exp)
|
匹配exp后面的位置 |
(?<=\bdanc)\w+\b
|
可以匹配I love dancing and reading中的第一个ing |
(?!exp)
|
匹配后面不是exp的位置 | ||
(?<!exp)
|
匹配前面不是exp的位置 | ||
*?
|
重复任意次,但尽可能少重复 |
a.*b a.*?b
|
将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aab和ab两个字符串 |
+?
|
重复1次或多次,但尽可能少重复 | ||
??
|
重复0次或1次,但尽可能少重复 | ||
{M,N}?
|
重复M到N次,但尽可能少重复 | ||
{M,}?
|
重复M次以上,但尽可能少重复 |
正则表达式使用re模块
常用函数及说明
函数 | 说明 |
---|---|
compile(pattern, flags=0)
|
编译正则表达式返回正则表达式对象 |
match(pattern, string, flags=0)
|
用正则表达式匹配字符串 成功返回匹配对象 否则返回None
|
search(pattern, string, flags=0)
|
搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None
|
split(pattern, string, maxsplit=0, flags=0)
|
用正则表达式指定的模式分隔符拆分字符串 返回列表 |
sub(pattern, repl, string, count=0, flags=0)
|
用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count 指定替换的次数
|
fullmatch(pattern, string, flags=0)
|
match 函数的完全匹配(从字符串开头到结尾)版本
|
findall(pattern, string, flags=0)
|
查找字符串所有与正则表达式匹配的模式 返回字符串的列表 |
finditer(pattern, string, flags=0)
|
查找字符串所有与正则表达式匹配的模式 返回一个迭代器 |
purge()
|
清除隐式编译的正则表达式的缓存 |
re.I / re.IGNORECASE
|
忽略大小写匹配标记 |
re.M / re.MULTILINE
|
多行匹配标记 |
Python办公自动化之文件读写操作与Excel,csv,PDF文件相关推荐
- C语言文件读写操作,写入数据到文件
很早写的在linux系统下的文件读写操作,写入数据到文件,很时候初学者学习 #include <stdio.h>int writeInfoToFile(char *strFile) {in ...
- Python办公自动化----文本文件的读写操作
用Python进行txt和csv文件的读写操作 在Python中实现文件操作可以使用Python内置的open函数来打开文件,在使用open函数时,可以通过函数的参数指定文件名.操作模式和字符编码等信 ...
- python学习的第二十五天:对PDF文件的读写操作
文章目录 python学习的第二十五天:对PDF文件的读写操作 对Excel操作的补充 python的实用方法 获取指定文件下的所有内容 shutil模块(封装了高级的文件操作函数) PDF的相关操作 ...
- python中的文件读写操作
python中的文件读写操作 思维导图 Python读写CSV文件 csv文件是什么? CSV(Comma Separated Values)全称逗号分隔值文件是一种简单.通用的文件格式,被广泛的应用 ...
- Python 文件读写操作-Python零基础入门教程
目录 一.Python 文件的打开 open 二.Python 文件的关闭 close 三.Python 文件的读取 read 1.read 函数 2.readline 函数 3.readlines ...
- python文件读写操作
文章目录 1. open函数介绍 2. 读文件 3. 写文件 4. with 方式读写文件 对文件进行读写操作是很常见的 I/O 操作,在Python中我们可以通过内置函数 open来完成. 1. o ...
- python 文件读写操作总结
python 文件读写操作总结 1.打开文件 open函数是python的内置函数,返回一个 file 对象 定义如下: open(file, mode='r', buffering=-1, enco ...
- Python文件读写缓冲区和文件读写操作实例
1.python文件缓冲区 f = open('test', 'w', 1) # 第三个参数为1表示行缓冲,默认值为-1 while True:data = input('>>>') ...
- Python办公自动化(二)|从Excel到Word
前言 在前几天的文章中我们讲解了如何从Word表格中提取指定数据并按照格式保存到Excel中,今天我们将再次以一位读者提出的真实需求来讲解如何使用Python从Excel中计算.整理数据并写入Word ...
- python办公自动化之批量生成docx——根据excel生成word、根据word生成excel
python办公自动化之批量生成docx--根据excel生成word 系列文章 本文目录 一.从excel读取 二.写入docx 三.批量生成docx 四.反向操作,根据word生成excel 系列 ...
最新文章
- mysql 分布式 安装_mysql分布式集群安装-阿里云开发者社区
- 在一起 10 年了,这封信你一定要收下
- mysql 5.5 barracuda_MySQL Antelope和Barracuda的区别分析
- Java基础--面向对象以及相关知识
- 灵活、高效、智慧,宁畅发布新品及“智定+”战略
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
- 你不懂API接口是什么?怎么和程序员做朋友
- Docker系列教程15-Docker容器网络
- 小编带着小白看springboot源码3
- SQLServer数据库中截取字符串的常用方法
- matlab如何输出恒定值,《工程与科学数值方法的MATLAB实现(第4版)》
- 2017计算机考研统考,2017年计算机考研408统考真题及答案.pdf
- 国外优秀的屏幕录象专家
- 按自己的思想写商业计划
- 学校人脸识别门禁功能介绍
- (Network Analysis)graph centrality measures
- 深度学习论文翻译解析(二十):YOLOv4: Optimal Speed and Accuracy of Object Detection
- 【零售知识】供应商结算
- VS隐藏菜单插件 Hide Main Menu
- wine模拟器安装xshell
热门文章
- python中双重循环_python中双循环
- Dungeon Game
- gg修改器怎么修改服务器数值,gg修改器怎么修改数值 | 手游网游页游攻略大全...
- 当NBA球星遇上机器学习……
- loj3059/bzoj5494/洛谷P5294 [HNOI2019]序列 单调栈+主席树
- 用于制作服装的天然纤维简介(动植物纤维)
- 威金又现!专杀收集整合
- iSCSI服务部署网络存储---共享网络存储设备
- python中oct函数_Python中的oct() 函数是什么?
- iOS NSLayoutConstraint priority