title: python文件读写和异常处理
date: 2025-02-21 16:36:40
tags:
- python
- 文件读写
- 异常处理
第一篇文章: java经验快速学习python!
python文件读写和异常处理
python处理文件读写,CVS文件、Excel文件、Word文件,操作PDF文件
文件读写和异常处理
1、打开和关闭文件
open
函数
2、读写文本文件
二者对比,少了finally块中的代码,代码变得优雅了,不会出现忘记关闭io流的情况
3、读写二进制文件
try:
with open('QQ图片20210731200950.jpg','rb') as f:
data=f.read()
with open('泷.jpg','wb') as f:
f.write(data)
except FileNotFoundError:
print('指定的文件无法打开')
except IOError:
print('读写文件时出现错误')
print('程序执行错误')
#如果要复制的图片很大,一次将文件内容读入内存可能会造成非常大的内存开销,为了减少对内存的占用,
# 可以为read方法传入size参数来指定每次读取的字节数
try:
with open("QQ图片20210731200950.jpg","rb") as f1,open('泷2.jpg','wb') as f2:
data=f1.read(512)
while data:
f2.write(data)
data = f1.read(512)
except FileNotFoundError:
print('指定的文件无法打开')
except IOError:
print('读写文件时出现错误')
print('程序执行结束')
对象的序列化和反序列化
python
和javascript
数据类型对应关系
对象的序列号和反序列化
#对象序列号和反序列化
import json
#读写json格式的数据
my_dict = {
'name': '骆昊',
'age': 40,
'friends': ['王大锤', '白元芳'],
'cars': [
{'brand': 'BMW', 'max_speed': 240},
{'brand': 'Audi', 'max_speed': 280},
{'brand': 'Benz', 'max_speed': 280}
]
}
# print(json.dumps(my_dict))
#如果要将字典处理成JSON格式并写入文本文件,只需要将dumps函数换成dump函数并传入文件对象即可,代码如下所示。
with open('my_dict.json', 'w') as f:
json.dump(my_dict, f)
json
模块有四个比较重要的函数,分别是:
dump
- 将Python对象按照JSON格式序列化到文件中dumps
- 将Python对象处理成JSON格式的字符串load
- 将文件中的JSON数据反序列化成对象loads
- 将字符串的内容反序列化成Python对象
with open('my_dict.json', 'r') as f:
dict=json.load(f)
print(type(dict))
print(dict)
包管理工具
Python标准库中的json
模块在数据序列化和反序列化时性能并不是非常理想,为了解决这个问题,可以使用三方库ujson
来替换json
。所谓三方库,是指非公司内部开发和使用的,也不是来自于官方标准库的Python模块,这些模块通常由其他公司、组织或个人开发,所以被称为三方库。虽然Python语言的标准库虽然已经提供了诸多模块来方便我们的开发,但是对于一个强大的语言来说,它的生态圈一定也是非常繁荣的。
之前安装Python解释器时,默认情况下已经勾选了安装pip,大家可以在命令提示符或终端中通过pip --version
来确定是否已经拥有了pip。pip是Python的包管理工具,通过pip可以查找、安装、卸载、更新Python的三方库或工具,macOS和Linux系统应该使用pip3。例如要安装替代json
模块的ujson
,可以使用下面的命令。
2、使用网络API获取数据
# 基本参数配置
apiUrl = 'http://v.juhe.cn/toutiao/index' # 接口请求URL
apiKey = '' # 在个人中心->我的数据,接口名称上方查看
# 接口请求入参配置
requestParams = {
'key': apiKey,
'type': '',
'page': '',
'page_size': '',
'is_filter': '',
}
# 发起接口网络请求
response = requests.get(apiUrl, params=requestParams)
# 解析响应结果
if response.status_code == 200:
responseResult = response.json()
# 网络请求成功。可依据业务逻辑和接口文档说明自行处理。
print(responseResult)
for data in responseResult['result']['data']:
print(data)
else:
# 网络异常等因素,解析结果异常。可依据业务逻辑自行处理。
print('请求异常')
3、操作CVS
将数据写入CSV文件
# 将数据写入CSV文件
import csv
import random
with open('hello.csv','w',newline='') as f:
writer = csv.writer(f)
writer.writerow(['姓名','语文','数学','英语'])
names=['关羽','赵云','马超','黄忠']
for name in names:
scores=[random.randrange(50,101) for _ in range(3)]
scores.insert(0,name)
writer.writerow(scores)
从CSV文件读取数据
#读取CVS文件
with open('hello.csv','r',newline='') as f:
reader=csv.reader(f,delimiter='|',quoting=csv.QUOTE_ALL)
for data_list in reader:
print(reader.line_num, end='\t')
print(data_list)
# for item in data_list:
# print(item,end='\t')
将来如果大家使用Python做数据分析,很有可能会用到名为pandas
的三方库,它是Python数据分析的神器之一。pandas
中封装了名为read_csv
和to_csv
的函数用来读写CSV文件,其中read_CSV
会将读取到的数据变成一个DataFrame
对象,而DataFrame
就是pandas
库中最重要的类型,它封装了一系列用于数据处理的方法(清洗、转换、聚合等);而to_csv
会将DataFrame
对象中的数据写入CSV文件,完成数据的持久化。read_csv
函数和to_csv
函数远远比原生的csvreader
和csvwriter
强大。
4、操作Excel文件
Python读写Excel文件-1
本章我们先讲解基于xlwt
和xlrd
操作 Excel 文件,大家可以先使用下面的命令安装这两个三方库以及配合使用的工具模块xlutils
。
pip install xlwt xlrd xlutils
读Excel文件
import openpyxl
from openpyxl.utils import get_column_letter
from datetime import datetime
# 使用openpyxl库的load_workbook函数打开指定Excel文件并获得Workbook对象(工作簿)
wb = openpyxl.load_workbook('2022年股票数据.xlsx') # 请确保文件名和路径正确
# 通过Workbook对象的sheetnames属性可以获取所有表单名称
sheetnames = wb.sheetnames
print("工作表名称:", sheetnames)
# 选择第一个工作表(您也可以根据名称选择特定的工作表)
sheet = wb[sheetnames[0]]
# 获取表单的行数和列数(注意:openpyxl没有直接的nrows和ncols属性,但可以通过max_row和max_column获取)
max_row = sheet.max_row
max_column = sheet.max_column
print("行数:", max_row, "列数:", max_column)
# 遍历每一行和每一列,获取单元格中的值并进行格式化处理
for row in sheet.iter_rows(values_only=True):
for col_idx, value in enumerate(row):
# 对除首行外的其他行进行数据格式化处理
if row[0] is not None and row[0] != sheet.cell(row=1, column=1).value: # 假设第一行为标题行
# 第1列的日期类型先转成datetime对象再格式化为“年月日”的格式
if col_idx == 0:
# openpyxl读取的日期是datetime对象(如果单元格格式正确的话)
# 这里我们直接进行格式化
value = value.strftime('%Y年%m月%d日') if isinstance(value, datetime) else value
# 其他列的number类型处理成小数点后保留两位有效数字的浮点数(如果已经是字符串则不处理)
elif isinstance(value, (int, float)):
value = f'{value:.2f}'
# 打印值,使用制表符分隔
print(value, end='\t')
print()
# 完成后关闭工作簿(可选,但推荐执行以释放资源)
wb.close()
写Excel文件
#写入excel文件
student_names=['关羽','张飞','赵云','马超','黄忠']
scores=[[random.randrange(50,101) for _ in range(3)] for _ in range(5)]
wb=xlwt.Workbook()
sheet=wb.add_sheet('一年级二班')
titles=('姓名','语文','数学','英语')
for index,title in enumerate(titles):
sheet.write(0,index,title)
sheet=header_style()
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])
#保存工作簿
wb.save('考试成绩表.xls')
调整单元格样式
def header_style():
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)
return sheet
调整单元格样式
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)
调整文字样式
def font_size(header_style):
font=xlwt.Font()
font.name='华文楷体'
font.height=20*18
font.bold=True
font.italic=False
font.color_index=1
header_style.font=font
return header_style
完整代码块
def font_size(header_style):
font=xlwt.Font()
font.name='华文楷体'
font.height=20*18
font.bold=True
font.italic=False
font.color_index=1
header_style.font=font
return header_style
def header_style():
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
header_style=font_size(header_style)
titles = ('姓名', '语文', '数学', '英语')
for index, title in enumerate(titles):
sheet.write(0, index, title, header_style)
return sheet
#写入excel文件
student_names=['关羽','张飞','赵云','马超','黄忠']
scores=[[random.randrange(50,101) for _ in range(3)] for _ in range(5)]
wb=xlwt.Workbook()
sheet=wb.add_sheet('一年级二班')
# titles=('姓名','语文','数学','英语')
#
# for index,title in enumerate(titles):
# sheet.write(0,index,title)
sheet=header_style()
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])
#保存工作簿
wb.save('考试成绩表.xls')
掌握了 Python 程序操作 Excel 的方法,可以解决日常办公中很多繁琐的处理 Excel 电子表格工作,最常见就是将多个数据格式相同的 Excel 文件合并到一个文件以及从多个 Excel 文件或表单中提取指定的数据。当然,如果要对表格数据进行处理,使用 Python 数据分析神器之一的 pandas 库可能更为方便。
openpyxl读写Excel
import datetime
import random
import openpyxl
wb=openpyxl.load_workbook('2022年股票数据.xlsx')
print(wb.sheetnames)
sheet=wb.worksheets[0]
print(sheet.dimensions)
print(sheet.max_row,sheet.max_column)
#获取指定单元格的值
print(sheet.cell(3,3).value)
print(sheet['C3'].value)
print(sheet['G255'].value)
print(sheet['A2:C5'])
#读取所有单元格的内容
for row in range(2,sheet.max_row+1):
for col_ch in 'ABCDEFG':
value=sheet[f'{col_ch}{row}'].value
if type(value)==datetime.datetime:
print(value.strftime('%Y年%m月%d'),end='\t')
elif type(value)==int:
print(f'{value:<10d}',end='\t')
elif type(value)==float:
print(f'{value:.4F}',end='\t')
else:
print(value)
print()
wb=openpyxl.Workbook()
sheet=wb.active
sheet.title='期末成绩'
titles=('姓名','语文','数学','英语')
for col_index,title in enumerate(titles):
sheet.cell(1,col_index+1,title)
names= ('关羽', '张飞', '赵云', '马超', '黄忠')
for row_index,name in enumerate(names):
sheet.cell(row_index+2,1,name)
for col_index in range(2,5):
sheet.cell(row_index+2,col_index,random.randrange(50,101))
wb.save('考试成绩表.xlsx')
5、操作Word文件
from docx import Document
from docx.shared import Pt, Cm
document=Document() # type: Doc
document.add_heading('快快乐乐学Python',0)
p=document.add_paragraph('Python是一门非常流行的语言,它')
run=p.add_run('简单')
run.bold=True
run.font.size=Pt(18)
p.add_run('而且')
run=p.add_run('优雅')
run.font.size=Pt(18)
run.underline=True
p.add_run('。')
#添加一级标题
document.add_heading('Heading,leven 1',level=1)
document.add_paragraph('Intense quote',style='Intense Quote')
#添加无序列表
document.add_paragraph('first item in unordered list',style='List Bullet')
document.add_paragraph('second item in unordered list',style='List Bullet')
#添加有序列表
document.add_paragraph('first item in ordered list',style='List Number')
document.add_paragraph('second item in ordered list',style='List Number')
#添加图片
document.add_picture('泷.jpg',width=Cm(5.2))
#添加分节符
document.add_section()
records=(
('罗汉','男','1999-10-11'),
('李大元','女','1999-10-12'),
)
#添加表格
table =document.add_table(rows=1,cols=3)
table.style='Dark List'
hdr_cells = table.rows[0].cells
hdr_cells[0].text='姓名'
hdr_cells[1].text='性别'
hdr_cells[2].text='出生日期'
#为表格添加行
for name,sex,birthday in records:
row_cells = table.add_row().cells
row_cells[0].text=name
row_cells[1].text=sex
row_cells[2].text=birthday
#添加分页符
document.add_page_break()
#保存文档
document.save('demo.docx')
遍历word文件
doc=Document('demo.docx')
for no,p in enumerate(doc.paragraphs):
print(no,p.text)
6、操作PDF文件
7、python处理图像
from PIL import Image, ImageFilter
image=Image.open('泷.jpg')
print(image.format)
print(image.size)
print(image.mode)
image.show()
#裁剪图像
# image.crop((80,20,310,360)).show()
#生成缩略图
image.thumbnail((128,128))
# image.show()
#缩放和粘贴图像
luoao_image=Image.open('泷.jpg')
guido_image=Image.open('泷.jpg')
head=guido_image.crop((80,20,310,360))
width,height=head.size
image.paste(head.resize((int(width/1.5),int(height/1.5))),(172,40))
image.show()
image=Image.open('泷.jpg')
image.rotate(45).show()
image.transpose(Image.FLIP_TOP_BOTTOM).show()
for x in range(80,310):
for y in range(20,360):
image.putpixel((x,y),(255,255,255))
image.show()
#滤镜效果
image.filter(ImageFilter.CONTOUR).show()
使用Pillow绘图
Pillow 中有一个名为ImageDraw
的模块,该模块的Draw
函数会返回一个ImageDraw
对象,通过ImageDraw
对象的arc
、line
、rectangle
、ellipse
、polygon
等方法,可以在图像上绘制出圆弧、线条、矩形、椭圆、多边形等形状,也可以通过该对象的text
方法在图像上添加文字。
import random
from PIL import Image,ImageDraw,ImageFont
def random_color():
"""生成随机颜色"""
r = random.randint(0,255)
g = random.randint(0,255)
b = random.randint(0,255)
return (r,g,b)
width,height=800,600
image=Image.new('RGB',(width,height),color=(255, 255, 255))
drawer=ImageDraw.Draw(image)
font=ImageFont.truetype('楷体_GB2312.ttf',32)
drawer.text((300,50),'Hello',font=font,fill=(255,0,0))
drawer.line((0,0,width,height),fill=(0, 0, 255),width=2)
drawer.line((width,0,0,height),fill=(0, 0, 255),width=2)
xy=width//2-60,height//2-60,width//2+60,height//2+60
drawer.rectangle(xy,outline=(255,0,0),width=2)
for i in range(4):
left,top,right,bottom=150+i*120,220,310+i*120,380
drawer.ellipse((left,top,right,bottom),outline=random_color(),width=8)
#显示图像
image.show()
image.save('result.png')
注意:上面代码中使用的字体文件需要根据自己准备,可以选择自己喜欢的字体文件并放置在代码目录下。
总结
使用 Python 语言做开发,除了可以用 Pillow 来处理图像外,还可以使用更为强大的 OpenCV 库来完成图形图像的处理,OpenCV(Open Source Computer Vision Library)是一个跨平台的计算机视觉库,可以用来开发实时图像处理、计算机视觉和模式识别程序。在我们的日常工作中,有很多繁琐乏味的任务其实都可以通过 Python 程序来处理,编程的目的就是让计算机帮助我们解决问题,减少重复乏味的劳动。通过本章节的学习,相信大家已经感受到了使用 Python 程序绘图改图的乐趣,其实 Python 能做的事情还远不止这些,继续你的学习吧。