【python基础(九)】文件和异常详解:使用、读取、写入、追加、保存用户的信息,以及优雅的处理异常
文章目录
- 一. 从文件中读取数据
- 1. 读取整个文件
- 2. 文件路径
- 3. 逐行读取
- 4. 创建一个包含文件各行内容的列表
- 二. 写入文件
- 1. 写入空文件
- 2. 写入多行
- 3. 附加到文件
- 三. 异常
- 1. 处理ZeroDivisionError异常
- 2. 使用try-except代码块
- 3. try-except-else ing
- 4. 处理FileNotFoundError异常
- 5. 分析文本
- 6. 使用多个文件
- 7. 静默失败
- 四. 存储数据
- 1. 使用json.dump()和json.load()
- 2. 保存和读取用户生成的数据
本文将学到:
- 如何使用文件;
- 如何一次性读取整个文件,以及如何以每次一行的方式读取文件的内容;
- 如何写入文件,以及如何将文本附加到文件末尾;
- 什么是异常以及如何处理程序可能引发的异常;
- 如何存储Python数据结构,以保存用户提供的信息,避免用户每次运行程序时都需要重新提供。
一. 从文件中读取数据
可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示这些内容。
要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。
1. 读取整个文件
样例文件:
3.141592653589793238462643383279
下面的程序打开并读取这个文件,再将其内容显示到屏幕上:
file_reader.py
if __name__ == '__main__':with open('pi_digits.txt') as file_object:contents = file_object.read()print(contents)
a. 接收文件参数
函数open()接受一个参数,要打开的文件的名称。
Python在当前执行的文件所在的目录中查找指定的文件。在本例中,当前运行的是file_reader.py,因此Python在file_reader.py所在的目录中查找pi_digits.txt。
b. 创建文件实例
with open('pi_digits.txt') as file_object 返回一个表示文件pi_digits.txt的对象,并将该对象赋给file_object。关键字with在不再需要访问文件后将其关闭。
c. 打开和关闭文件
关键字with在时,不再需要访问文件后将其关闭。
在这个程序中,注意到我们调用了open(),但没有调用close()。也可以调用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug导致方法close()未执行,文件将不会关闭。
通过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。
类似java 7中的自动关闭流
d. 读取文件
使用方法read()读取这个文件的全部内容,并将其作为一个长长的字符串赋给变量contents。这样,通过打印contents的值,就可将这个文本文件的全部内容显示出来:
3.141592653589793238462643383279
e. 处理空行
相比于原始文件,该输出唯一不同的地方是末尾多了一个空行。为何会多出这个空行呢?因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在函数调用print()中使用rstrip():
with open('pi_digits.txt') as file_object:contents = file_object.read()print(contents.rstrip())
2. 文件路径
相对路径
例如,你可能将程序文件存储在了文件夹python_work中,而该文件夹中有一个名为text_files的文件夹用于存储程序文件操作的文本文件。
可以使用相对文件路径来打开其中的文件,该位置是相对于当前运行的程序所在目录的。
with open('text_files/filename.txt') as file_object:
绝对文件路径
将文件在计算机中的准确位置告诉Python,这样就不用关心当前运行的程序存储在什么地方了。这称为绝对文件路径。
file_path = '/home/ehmatthes/other_files/text_files/_filename_.txt'
with open(file_path) as file_object:
3. 逐行读取
要以每次一行的方式检查文件,可对文件对象使用for循环:
if __name__ == '__main__':with open('pi_digits.txt') as file_object:for line in file_object:print(line.strip())
因为在这个文件中,每行的末尾都有一个看不见的换行符,而函数调用print()也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自函数调用print()。所以在函数调用print()中使用rstrip()。
4. 创建一个包含文件各行内容的列表
将文件各行缓存到列表中,等到需要时再使用。
示例:
在with代码块中将文件pi_digits.txt的各行存储在一个列表中,再在with代码块外打印:
with open('pi_digits.txt') as file_object:lines = file_object.readlines()for line in lines:print(line.rstrip())
二. 写入文件
1. 写入空文件
with open('pi_digits.txt','w') as file_object:file_object.write("I love python")
- 实参一也是要打开的文件的名称。
- 实参二(‘w’)告诉Python,要以写入模式打开这个文件。
– 打开文件时,可指定读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)或读写模式(‘r+’)。如果省略了模式实参,Python将以默认的只读模式打开文件。
– 如果要写入的文件不存在,函数open()将自动创建它。然而,以写入模式(‘w’)打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件的内容。
注意 Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。
2. 写入多行
函数write()不会在写入的文本末尾添加换行符,因此如果写入多行时没有指定换行符,文件看起来可能不是你希望的那样:
with open('programming.txt', 'w') as file_object:file_object.write("I love programming.\n")file_object.write("I love creating new games.\n")
要让每个字符串都单独占一行,需要在方法调用write()中包含换行符。
3. 附加到文件
如果要给文件添加内容,而不是覆盖原有的内容,可以以附加模式打开文件。
with open(filename, 'a') as file_object:file_object.write("I also love finding meaning in large datasets.\n")file_object.write("I love creating apps that can run in a browser.\n")
三. 异常
每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果未对异常进行处理,程序将停止并显示traceback,其中包含有关异常的报告。
1. 处理ZeroDivisionError异常
print(5/0)# Traceback (most recent call last):# File "division_calculator.py", line 1, in <module># print(5/0)# ZeroDivisionError: division by zero
在上述traceback中,ZeroDivisionError是个异常对象。Python无法按你的要求做时,就会创建这种对象。在这种情况下,Python将停止运行程序,并指出引发了哪种异常。
2. 使用try-except代码块
if __name__ == '__main__':try:print(5 / 0)except ZeroDivisionError:print("You can't divide by zero!")
在本例中,try代码块中的代码引发了ZeroDivisionError异常,因此Python查找指出了该怎么办的except代码块,并运行其中的代码。
3. try-except-else ing
通过将可能引发错误的代码放在try-except代码块中,可提高程序抵御错误的能力。依赖try代码块成功执行的代码都应放到else代码块中:
if __name__ == '__main__':while True:if second_number =='q':breaktry:answer = int(first_name)/int(second_number)except ZeroDivisionError:print("You can't divide by zero!")else:print(answer)
try-except-else代码块的工作原理大致如下。Python尝试执行try代码块中的代码,只有可能引发异常的代码才需要放在try语句中。有时候,有一些仅在try代码块成功执行时才需要运行的代码,这些代码应放在else代码块中。
但是:我直接将
print(answer)放到answer下面一行不行吗?测试可信。
4. 处理FileNotFoundError异常
filename = 'alice.txt'try:with open(filename, encoding='utf-8') as f:contents = f.read()
except FileNotFoundError:print(f"Sorry, the file {filename} does not exist.")
5. 分析文本
if __name__ == '__main__':filename = 'alice1.txt'try:with open(filename, encoding='utf-8') as f:contents = f.read()except FileNotFoundError:print(f"Sorry, the file {filename} does not exist.")else:# 计算该文件大致包含多少个单词。words = contents.split()num_words = len(words)print(f"The file {filename} has about {num_words} words.")
6. 使用多个文件
def count_words(filename):--snip--filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:count_words(filename)
7. 静默失败
有时候你希望程序在发生异常时保持静默,就像什么都没有发生一样继续运行。
def count_words(filename):"""计算一个文件大致包含多少个单词。"""try:--snip--except FileNotFoundError:
❶ passelse:--snip--filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']for filename in filenames:count_words(filename)
现在,出现FileNotFoundError异常时,将执行except代码块中的代码,但什么都不会发生。这种错误发生时,不会出现traceback,也没有任何输出。用户将看到存在的每个文件包含多少个单词,但没有任何迹象表明有一个文件未找到。
四. 存储数据
模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据
1. 使用json.dump()和json.load()
第一个程序将使用json.dump()来存储这组数,而第二个程序将使用json.load()。
if __name__ == '__main__':# 写入文件numbers = [2, 3, 5, 7, 11, 13]filename = 'numbers.json'with open(filename, 'w') as f:json.dump(numbers, f)# 读文件with open(filename) as f:numbers_read = json.load(f)print(numbers_read)
2. 保存和读取用户生成的数据
import jsonif __name__ == '__main__':# 如果以前存储了用户名,就加载它。# 否则,提示用户输入用户名并存储它。filename = 'username.json'try:with open(filename) as f:username = json.load(f)except FileNotFoundError:username = input("What is your name? ")with open(filename, 'w') as f:json.dump(username, f)print(f"We'll remember you when you come back, {username}!")else:print(f"Welcome back, {username}!")
参考:《Python编程:从入门到实践(第二版)》
相关文章:
【python基础(九)】文件和异常详解:使用、读取、写入、追加、保存用户的信息,以及优雅的处理异常
文章目录 一. 从文件中读取数据1. 读取整个文件2. 文件路径3. 逐行读取4. 创建一个包含文件各行内容的列表 二. 写入文件1. 写入空文件2. 写入多行3. 附加到文件 三. 异常1. 处理ZeroDivisionError异常2. 使用try-except代码块3. try-except-else ing4. 处理FileNotFoundError异…...
详解C语言中的指针数组和数组指针
指针数组和数组指针是 C 语言中比较常见的两种类型。它们虽然名字很相似,但是含义、用法以及指向类型都不同,需要分开理解。 指针数组 指针数组是一个数组,其中每个元素都是一个指针。这些指针可以指向不同类型的数据,也可以指向…...
【done】剑指offer18:删除链表指定节点
力扣,https://leetcode.cn/problems/shan-chu-lian-biao-de-jie-dian-lcof/description/ // 自己写的答案 class Solution {public ListNode deleteNode(ListNode head, int val) {if (head null) {return null;}if (head.val val) {return head.next;}ListNode …...
图形编辑器开发:缩放和旋转控制点
大家好,我是前端西瓜哥。好久没写图形编辑器开发的文章了。 今天来讲讲控制点。它是图形编辑器的不可缺少的基础功能。 控制点是吸附在图形上的一些小矩形和圆形点击区域,在控制点上拖拽鼠标,能够实时对被选中进行属性的更新。 比如使用旋…...
【2023 云栖】阿里云田奇铣:大模型驱动 DataWorks 数据开发治理平台智能化升级
云布道师 本文根据 2023 云栖大会演讲实录整理而成,演讲信息如下: 演讲人:田奇铣 | 阿里云 DataWorks 产品负责人 演讲主题:大模型驱动 DataWorks 数据开发治理平台智能化升级 随着大模型掀起 AI 技术革新浪潮,大数…...
Rust语言入门教程(二) - 变量与作用域
变量与作用域 变量的声明与初始化 Rust的基本语法格式如下: fn main(){let bunnies 2; }语句以分号结尾,用花括号包含语句块。 Rust的语法其实借鉴了很多其他的语言,比如C语言和Python, 所以变量定义的格式看起来也跟很多我们…...
芯知识 | Flash可更换声音语音芯片—引领音频IC技术革新的新篇章
随着科技的飞速发展,人们对于电子产品的音频性能要求越来越高。在这种背景下,Flash可更换声音语音芯片应运而生,成为音频技术领域的一颗璀璨明星。本文将详细介绍Flash可更换声音语音芯片的特点、优势以及应用场景,展望其在未来科…...
合共软件创新亮相:第102届上海电子展成就技术新篇章
2023年,第102届中国(上海)电子展活动在全球瞩目中圆满落幕。作为下半年华东地区最具影响力的电子展会,此次盛会吸引了来自全球的600家领先企业,共同探讨电子元器件行业的最新发展成果和趋势。 本届展会围绕核心先导元器…...
Ubuntu20.04清理垃圾vscode缓存
使用VM虚拟机安装了Ubuntu系统,主目录空间越来越小,硬盘扩容之后很快又空间不足,甚至出现了开机卡黑屏的情况,这里记录一下解决过程。 1 重新开机进入系统 状态:卡到了开机黑屏状态,左上角有一条小横杠 原…...
网络数据结构skb_buff原理
skb_buff基本原理 内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体,而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2,则是通过往sk_buff结构体中增加该层协议头来操作;如果是从L4到L2,则是通过移动sk_…...
SpringCache使用详解
SpringCache 1.新建测试项目SpringCache2.SpringCache整合redis2.1.Cacheable2.2.CacheEvict2.3.Cacheput2.4.Caching2.5.CacheConfig 3.SpringCache问题4.SpringCache实现多级缓存 1.新建测试项目SpringCache 引入依赖 <dependencies><dependency><groupId&g…...
windows版本的grafana如何离线安装插件
本文以安装clickhouse的插件为例,记录下如何离线安装插件 1 下载插件 ClickHouse plugin for Grafana | Grafana Labs 2 找到grafana的配置文件 打开编辑,搜索plugin关键字,修改plugin的加载目录 目录不存在,手动创建࿰…...
ElasticSearch01
ElasticSearch 版本:7.8 学习视频:尚硅谷 笔记:https://zgtsky.top/ ElasticSearch介绍 Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;…...
GPT、GPT-2、GPT-3论文精读笔记
视频:GPT,GPT-2,GPT-3 论文精读【论文精读】_哔哩哔哩_bilibili MAE论文:把bert用回计算机视觉领域 CLIP论文:打通文本和图像 GPT 论文:Improving Language Understanding by Generative Pre-Training …...
深度学习八股文:混合精度训练过程出nan怎么办
其实如果是FP32的训练,基本的调试方法还是差不多,这里就讲一下混合精度训练过程中的nan。 混合精度训练使用较低的数值精度(通常是半精度浮点数,例如FP16)来加速模型训练,但在一些情况下,可能会…...
竞赛选题 题目:基于卷积神经网络的手写字符识别 - 深度学习
文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…...
Cesium-terrain-builder编译入坑详解
本以为编译cesium-terrian-tools编译应该没那么难,不想问题重重,不想后人重蹈覆辙,也记录下点点滴滴。 目前网上存在的cesium代码版本主要有两个分支: 原始网站【不能生成layer文件,且经久不更新,使用gdal…...
3.1 CPU内部结构与时钟与指令
CPU内部结构 总线一些自定义部件总线图内存指令执行流程:取指令,译码,执行pc做的事内存地址寄存器内存缓存寄存器指令寄存器,译码第一步指令寄存器传递地址到内存地址寄存器指令MOV_A的过程(译码第二步)第一条指令执行完毕第三条指令的执行第四条指令第四条指令不同的执行流程…...
电机应用-直流有刷电机多环控制实现
目录 直流有刷电机多环控制实现 硬件设计 直流电机三环(速度环、电流环、位置环)串级PID控制-位置式PID 编程要点 配置ADC可读取电流值 配置基本定时器6产生定时中断读取当前电路中驱动电机的电流值并执行PID运算 配置定时器1输出PWM控制电机 配…...
Java常量池理论篇:Class常量池、运行时常量池、String常量池、基本类型常量池,intern方法1.6、1.7的区别
文章目录 Class常量池运行时常量池String常量池基本类型常量池Integer 常量池Long 常量池 加餐部分 Class常量池 每个Class字节码文件中包含类常量池用来存放字面量以及符号引用等信息。 运行时常量池 java文件被编译成class文件之后,也就是会生成我上面所说的 …...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
