第16天

编程入门 行业动态 更新时间:2024-10-03 08:23:31

第16天

第16天

第16天—python办公自动化—文件读写

打开和关闭文件

Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。

必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。

打开文件语法:

file = open(file='文件路径', mode='操作模式', encoding='字符编码')

操作模式具体说明如下表:

下图展示了如何根据程序的需要来设置open函数的操作模式。

File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。

当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。

关闭文件语法:

file.close()

读写文本文件

file = open(file='resources/致橡树.txt', mode='r', encoding='utf-8')
try:# 如果读不到数据,read方法会返回Nonedata = file.read(32)while data:print(data, end='')data = file.read(32)
finally:file.close()

finally —> 总是执行代码(不管正常异常,finally中的代码一定会被执行到)

读取二进制文件(字节文件)

读写二进制文件跟读写文本文件的操作类似,但是需要注意,在使用open函数打开文件时,如果要进行读操作,操作模式是'rb',如果要进行写操作,操作模式是'wb'

from io import SEEK_SET, SEEK_ENDfile = open(file='resources/m.jpg', mode='rb')
# 移动文件指针到文件末尾,可以先用seek方法将文件指针移动到文件末尾
# 然后通过tell方法获取文件指针移动的字节数,这个字节数就是文件的大小
file.seek(0, SEEK_END)
print(file.tell())
# 将文件指针移动到文件最开始的地方
file.seek(0, SEEK_SET)
try:# 通过参数指定每次读取的大小长度,这样就避免了因为文件太大读取出问题。data = file.read(1024)while data:print(data, end='')data = file.read(1024)
finally:file.close()

读取官方Python解释器文件,计算MD5哈希码(签名、指纹、摘要)

哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。

from hashlib import md5, sha256hasher = md5()
hasher2 = sha256()
file = open('resources/python-3.9.6-amd64.exe', 'rb')
try:data = file.read(512)while data:# 更新MD5对象的数据hasher.update(data)# 更新SHA-256对象的数据hasher2.update(data)data = file.read(512)
finally:file.close()
# 获得十六进制形式的MD5哈希摘要
print(hasher.hexdigest())
# 获得十六进制形式的SHA-256
print(hasher2.hexdigest())

写文本文件

# 操作模式 - w - 创建新文件或截断原有文件的内容再进行写入
file = open('resources/小雨康桥的诗.txt', mode='w', encoding='utf-8')
try:file.write('我想做燕子\n')file.write('只需简单思想\n')file.write('只求风中流浪\n')file.write('我想做树\n')file.write('不长六腑五脏\n')file.write('不会寸断肝肠\n')
finally:file.close()
# 操作模式 - a - 创建新文件或将文件指针移动到原有文件的末尾再写入新内容
# with - 上下文语法 - 进入和离开with的时候会自动执行某些操作
# 下面的写法在离开with上下文的时候,会自动执行file对象的close()方法
with open('resources/小雨康桥的诗.txt', mode='a', encoding='utf-8') as file:file.write('我做不成燕子\n')file.write('所以我飞不过感情的墙\n')file.write('我做不成树\n')file.write('因此也撑不破伤心的网\n')

文件复制

def file_copy(source_file, target_file):with open(source_file, 'rb') as source:with open(target_file, 'wb') as target:# 通过参数指定每次读取的大小长度,这样就避免了因为文件太大读取出问题。data = source.read(512)while data:target.write(data)data = source.read(512)if __name__ == '__main__':file_copy('文件路径', '复制到的文件路径')

练习1:

将100以内的质数输出到文件中每行一个数。

with open('resources/prime.txt', mode='w', encoding='utf-8') as file:for num in range(2, 100):b = Truefor i in range(2, int(num ** 0.5) - 1):if num % i == 0:b = Falsebreakif b:file.write(f'{num}\n')![8](C:\Users\jyxbyx\Desktop\博客\16\8.png)

练习2:

从文件中读入体温测量数据,显示体温不正常的病人的信息。

37.2以下—>正常

37.2~38.5 —>发热

38.5以上—>高热

import csv
with open('resources/temperature.txt', encoding='utf-8') as file:with open('resources/result.csv', 'w', encoding='gbk', newline='') as file2:writer = csv.writer(file2, delimiter='|')# writerow方法的参数是一个列表或元组(代表一行中所有的数据,默认用逗号分隔)writer.writerow(['ID', 'temperature', 'information'])# readline一行一行的读取content = file.readline()while content:# 进行拆分no, temp = content.split()temp = float(temp)if temp >= 37.2:if temp <= 38.5:info = '发热'else:info = '高烧'writer.writerow([no, temp, info])content = file.readline()

读取csv(逗号分隔值)文件

​ —> Comma Seperated Value

import csv# UTF-8 with BOM ---> Byte Order Marker --->带字节序标记((签名)的UTF-8
with open('resources/2018年北京积分落户数据.csv', encoding='utf-8-sig') as file:# delimiter ---> 设置分隔符(默认是英文逗号)# quotechar ---> 包裹字符串的符号(默认是英文双引号)reader = csv.reader(file, delimiter=',', quotechar='"')for row in reader:print(row)

练习3:

10个学生,3门课程,生成随机成绩,写入CSV文件

学生姓名用input录入,成绩用random随机生成

import csv
import randomwith open('resources/student.csv', mode='w', encoding='utf-8-sig', newline='') as file:writer = csv.writer(file)writer.writerow(['名字', '语文', '数学', '英语'])for i in range(10):name = input('name = ')chinese = random.randrange(50, 100)math = random.randrange(50, 100)english = random.randrange(50, 100)writer.writerow((f'{name}', chinese, math, english))

练习4:

读取刚才的CSV文件,计算每个学生的平均分,统计每门课的最高分、最低分、标准差

import csvdef average(data):return sum(data) / len(data)def var(nums):x_bar = average(nums)temp = [(num - x_bar) ** 2 for num in nums]return sum(temp) / (len(temp) - 1)def std(data):return var(data) ** 0.5def main():with open('resources/student.csv', encoding='utf-8-sig') as file:reader = csv.reader(file, delimiter=',')names, chinese, math, english = [], [], [], []for row in reader:names.append(row[0])chinese.append(row[1])math.append(row[2])english.append(row[3])names.pop(0)chinese.pop(0)math.pop(0)english.pop(0)chinese = list(map(int, chinese))math = list(map(int, math))english = list(map(int, english))for i in range(len(names)):nums = [chinese[i], math[i], english[i]]print(f'{names[i]}的平均分为:{average(nums)}')print(f'语文的最高分为:{max(chinese)}')print(f'语文的最低分为:{min(chinese)}')print(f'语文的标准差为:{std(chinese)}')print(f'数学的最高分为:{max(math)}')print(f'数学的最低分为:{min(math)}')print(f'数学的标准差为:{std(math)}')print(f'英语的最高分为:{max(english)}')print(f'英语的最低分为:{min(english)}')print(f'英语的标准差为:{std(english)}')if __name__ == '__main__':main()

异常处理机制

在程序运行过程中,总会遇到各种各样的错误。

  1. 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的。
  2. 有的错误是用户输入造成的,比如让用户输入email地址,结果得到一个空字符串,这种错误可以通过检查用户输入来做相应的处理。
  3. 还有一类错误是完全无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了。这类错误也称为异常,在程序中通常是必须处理的,否则,程序会因为各种问题终止并退出。

Python内置了一套异常处理机制,来帮助我们进行错误处理。

python 的异常机制主要依赖 tryexceptelsefinallyraise五个关键字:

  • try关键字后缩进的代码块简称try 块,它里面放置的是可能引发异常的代码;
  • except后对应的是异常类型和一个代码块,用于表明该 except 块处理这种类型的代码块;
  • 在多个 except 块之后可以放一个 else 块,表明程序不出现异常时还要执行 else 块;
  • 最后还可以跟一个finally 块,finally 块用于回收在try块里打开的物理资源,异常机制会保证 finally 块总被执行;
  • raise 用于引发一个实际的异常,raise 可以单独作为语句使用,引发一个具体的异常对象;
try:#业务实现代码
except Exception1 as e:#异常处理块1...
except Exception2 as e:#异常处理块2...
#可以有多个 except
...
else:#正常处理块
finally :#资源回收块...

注意,在整个异常处理结构中,只有try块是必需的,也就是说:

  • 如果没有try 块,则不能有后面的 except 块、else 块和finally块。但是也不能只使用 try 块,要么使用 try except 结构,要么使用try finally 结构;
  • except 块、else块、finally块都是可选的,当然也可以同时出现;
  • 可以有多个 except 块,但捕获父类异常的 except 块应该位于捕获子类异常的 except 块的后面;
  • 多个 except 块必须位于 try 块之后,finally 块必须位于所有的 except 块之后。
  • 要使用 else 块,其前面必须包含 tryexcept

更多推荐

第16天

本文发布于:2024-02-28 02:56:48,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767304.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!