Python小白入门:文件、异常处理和json格式存储数据
这里写自定义目录标题
- 所用资料
- 一、从文件中读取数据
- 1.1 读取整个文件
- 1.2 文件路径
- 1.3 逐行读取
- 1.4 创建一个包含文件各行内容的列表
- 1.5 使用文件的内容
- 1.6 包含一百万位的大型文件
- 1.7 圆周率值中包含你的生日吗
- 练习题
- 二、写入文件
- 2.1 写入空文件
- 2.2 写入多行
- 2.3 附加到文件
- 练习题
- 三、异常
- 3.1 ZeroDivisionError异常
- 3.2 使用 try - except 模块
- 3.3 try - except - else 代码块
- 3.4 处理 FileNotFoundError 异常
- 3.5 分析文本的字符
- 3.6 分析多个文件
- 3.7 遇到异常时保持静默
- 练习题
- 四、存储数据
- 4.1 使用json.dump( )和json.load( )
- 4.2 保存和读取用户生成的数据
所用资料
代码中所用到的文件可以从下面的网站进行下载:
https://www.ituring.com.cn/book/2784
一、从文件中读取数据
1.1 读取整个文件
with open('files/pi_digits.txt') as file_object:contents = file_object.read()
print(contents)
- open函数
打开一个文件。接收参数为需要打开的文件名。Python会在当前执行的文件所在目录下查找指定文件,因此需要把pi_digits.txt文件放在执行文件的同目录下。
open函数返回一个表示文件的对象,Python将通过as关键字该对象赋予file_object。
- with关键字
再不需要访问文件后,Python会将其自动关闭。比直接使用close函数(关闭文件函数)更加安全。
- read函数
读取文件内容,以字符串形式赋给contents变量。read函数在读取到文件末尾时会返回一个空字符串,打印出来就是一个空行,可以对contents中使用rstrip函数进行结尾的空行删除。
with open('pi_digits.txt') as file_object:contents = file_object.read()
print(contents.rstrip())
可以看到空白行被删除掉了。
1.2 文件路径
-
相对路径: 相对于当前运行的程序所在的目录位置进行查找。如当前运行的程序为python_work,其中有一个名为files的文件夹存储了file.txt文件,路径为: files\file.txt,python会自动在python_work中寻找。
-
绝对路径:计算机中文件存储的准确位置,如:C:学习\Python从入门到实践第二版源代码文件\源代码文件\chapter_10。因为绝对路径较长,一般会将该字符串先赋给一个变量file_path,然后传入Open函数中
注:显示文件路径时,Windows系统使用反斜杠(\ )而不是斜杠(/ ),但在代码中使用斜杠来代表路径。
1.3 逐行读取
以每一行的方式读取文件:使用for循环。
file_path = 'files/pi_digits.txt'
with open(file_path) as file_object:for line in file_object:print(line.rstrip())
使用for循环,让变量line代表文件中的每一行进行输出。
1.4 创建一个包含文件各行内容的列表
- readlines函数:从文件中读取每一行并将其存储在一个列表中。
- readline函数:从文件中读取一行,并作为字符串保存。
file_path = 'files/pi_digits.txt'
with open(file_path) as file_object:line = file_object.readline()lines = file_object.readlines()print(line)
print(lines)
代码使用lines接收readlines函数读到的存储文件中的每一行内容的列表。
可以看到每一行后面都有一个换行符。
读取到的lines即可使用for循环进行每一行内容的读取。
1.5 使用文件的内容
将文件读取到内存中后即可使用数据。
Python中有三个去除头尾字符、空白符的函数,它们依次为:
- strip: 用来去除头尾字符、空白符(包括\n、\r、\t、’ ‘,即:换行、回车、制表符、空格)
- lstrip:用来去除开头字符、空白符(包括\n、\r、\t、’ ‘,即:换行、回车、制表符、空格)
- rstrip:用来去除结尾字符、空白符(包括\n、\r、\t、’ ',即:换行、回车、制表符、空格)
为了把文件中拿到的内容整合成一行没有中间空白字符的字符串,使用strip函数进行去空白。
去空白函数
file_path = 'files\pi_digits.txt'with open(file_path) as file_objects:lines = file_objects.readlines()pi_strings = ""
for line in lines:pi_strings += line.strip()print(pi_strings)
print(len(pi_strings))
pi_number = float(pi_strings)
print(pi_number)
print(type(pi_number))
strip函数不仅可以删除每行后面的空白字符,还可以把每行开头的空白符也进行删除。这样就得到了一个pi_string的字符串。
如果想后续进行数值的计算,需要把字符串转为数值进行使用,可以使用float函数进行类型转换。
1.6 包含一百万位的大型文件
所需文件:
读取一个精确到小数点后1000000位的圆周率文件。
file_path = 'files/pi_million_digits.txt'with open(file_path) as file_objects:lines = file_objects.readlines()pi_string = ""
for line in lines:pi_string += line.strip()print(pi_string[:52])
print(len(pi_string))
打印前52位,然后输出一下字符串的长度,证明确实是有1000002位数。
1.7 圆周率值中包含你的生日吗
可以查看一下自己的生日是否在圆周率中,如果存在,使用index函数查找到生日字符串在pi字符串中的位置并且输出。
file_path = 'files/pi_million_digits.txt'with open(file_path) as file_objects:lines = file_objects.readlines()pi_string = ""
for line in lines:pi_string += line.strip()birthday = input("Please enter your birthday, in the form mmdd: ")if birthday in pi_string:print(f"Your birthday appears in the first million digits of pi at the index of {pi_string.index(birthday)}!")
else:print("Sorry~")
练习题
file_path = 'files/learning_python.txt'with open(file_path) as file_objects:contents = file_objects.read()
print(contents)with open(file_path) as file_objects:for line in file_objects:print(line.rstrip())with open(file_path) as file_objects:lines = file_objects.readlines()
print(lines)
file_path = 'files/learning_python.txt'with open(file_path) as f:lines = f.readlines()for line in lines:print(line.rstrip().replace('Python','c++'))
二、写入文件
2.1 写入空文件
调用open() 时提供了两个实参:
- 第一个实参:要打开的文件的名称。
- 第二个实参(‘w’ ):告诉Python要以写入模式打开这个文件。
打开文件时,可指定读取模式 (‘r’ )、写入模式 (‘w’ )、附加模式 (‘a’ )或读写模式 (‘r+’ )。如果省略了模式实参,Python将以默认的只读模式打开文件。
如果要写入的文件不存在,函数open() 将自动创建它。
然而,以写入模式(‘w’)打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件的内容。
Python只能将字符串写入文本文件。 要将数值数据存储到文本文件中,必须先使用函数str() 将其转换为字符串格式。
filename = 'programming.txt'with open(filename,'w') as f:f.write('I love programming!')
2.2 写入多行
在writer函数中添加换行符。
filename = 'programming.txt'with open(filename,'w') as f:f.write('I love writing!\n')f.write('I love programming!\n')
2.3 附加到文件
如果不想覆盖掉之前的内容,而是想给文件添加内容的话,可以以附加模式(a) 打开文件。
以附加模式打开文件时,Python不会在返回文件对象前清空文件的内容,而是将写入文件的行添加到文件末尾。
如果指定的文件不存在,Python将为你创建一个空文件。
filename = 'programming.txt'with open(filename,'a') as f:f.write('I love painting!\n')f.write('I love swimming!\n')with open(filename) as f:lines = f.read()
print(lines)
练习题
10-3
filename = 'guests.txt'
name = input('enter the name: ')
with open(filename,'w') as f:f.write(name.title())
10-4
filename = 'guest_book.txt'
with open (filename,'a') as f:while True:name = input("Enter the name: ")if name == 'q':breakprint(f"Hi, {name.title()} !")f.write(f"{name.title()}\n")
10-5
filename = 'reason.txt'
with open(filename,'a') as f:while True:reason = input('Enter the reason why you like programming')if reason=='quit':breakf.write(f"{reason}\n")
三、异常
异常:一个特殊对象,管理程序执行期间发生的错误。
每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果未对异常进行处理,程序将停止并显示traceback,其中包含有关异常的报告。
异常是使用try-except 代码块处理的。
try-except 代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。使用try-except 代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。
3.1 ZeroDivisionError异常
ZeroDivisionError异常:被除数不能为0的异常。
3.2 使用 try - except 模块
当认为可能会发生错误时,可编写一个try-except 代码块来处理可能引发的异常。
- try下写让Python尝试运行一些代码,
- except下写如果这些代码引发了指定的异常该怎么办。
try:print(5/0)
except ZeroDivisionError:print("You can't divide by zero! ")
将导致错误的代码行 print(5/0) 放在一个try 代码块中。如果try 代码块中的代码运行起来没有问题,Python将跳过except 代码块;如果try 代码块中的代码导致了错误,Python将查找与之匹配的except 代码块并运行其中的代码。
在本例中,try 代码块中的代码引发了ZeroDivisionError 异常,因此Python查找指出了该怎么办的except 代码块,并运行其中的代码。这样,用户看到的是一条友好的错误消息,而不是traceback。
3.3 try - except - else 代码块
使用try-except进行异常处理,而依赖try代码块成功执行的代码都应放到else代码块中。
while True:n1 = input("First number: ")if n1 == 'q':breakn2 = input('Second number: ')if n2 == 'q':breaktry:result = int(n1)/int(n2)except ZeroDivisionError:print("You can't divide by 0!")else:print(result)
3.4 处理 FileNotFoundError 异常
FileNotFoundError 异常:找不到文件
filename = 'alice.txt'try:with open(filename) as f:contents = f.read()except FileNotFoundError:print(f"{filename} doesn't exit!")
3.5 分析文本的字符
统计alice.txt文件中所有的英文单词数量。
- split()函数:为一个字符串中的英文单词创建一个单词列表
- encoding = ‘utf-8’:当系统默认编码和读取文件使用的编码不一致时使用。
filename = 'alice.txt'try:with open(filename,encoding = 'utf-8') as f:contents = f.read()except FileNotFoundError:print(f"{filename} doesn't exit!")else:words = contents.split()num_word = len(words)print(f"The file {filename} has about {num_word} words.")
3.6 分析多个文件
filenames = [‘alice.txt’,‘siddhartha.txt’,‘mobd_dick.txt’]
其中siddhartha.txt文件不存在。使用for循环对文件列表中的文件一次读取并且分析。
def count_words(filename):try:with open(filename, encoding='utf-8') as f:contents = f.read()except FileNotFoundError:print(f"{filename} doesn't exit!")else:words = contents.split()num_word = len(words)print(f"The file {filename} has about {num_word} words.")filenames = ['alice.txt','siddhartha.txt','moby_dick.txt']
for filename in filenames:count_words(filename)
3.7 遇到异常时保持静默
如果想要发生异常时程序什么也不说,像什么都没有发生过一样继续执行,那就在except模块下使用pass语句。
def count_words(filename):try:with open(filename, encoding='utf-8') as f:contents = f.read()except FileNotFoundError:passelse:words = contents.split()num_word = len(words)print(f"The file {filename} has about {num_word} words.")filenames = ['alice.txt','siddhartha.txt','moby_dick.txt']
for filename in filenames:count_words(filename)
练习题
10-6
try:n1 = int(input("the first number is :"))n2 = int(input("The second number is :"))
except ValueError:print("Please enter number not text!")
else:print(n1+n2)
10-7
while True:try:n1 = int(input("the first number is :"))n2 = int(input("The second number is :"))except ValueError:print("Please enter number not text!")else:print(n1+n2)
10-8
四、存储数据
JSON格式:存储数据结构,最初是为JavaScript开发,但随后成了一种常见格式,被包括Python在内的众多语言采用。
模块json 让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。
还可以使用json 在Python程序之间分享数据。
更重要的是,JSON数据格式并非Python专用的,JSON格式存储的数据可以与使用其他编程语言共享。
4.1 使用json.dump( )和json.load( )
-
函数json.dump() : 把数据存储在文件中。接受两个实参,要存储的数据,以及可用于存储数据的文件对象。
-
json.load() : 把数据读取到内存中。
import json
numbers = [2,3,4,5,7.11,13]
filename = 'numbers.json'
with open(filename,'w') as f:json.dump(numbers,f)
首先import json模块,然后使用json.dump把数字列表存储进number.json文件中。
使用json.load(f)把numbers.json文件中的数据结构存进内存中,然后打印输出。
import json
filename = 'numbers.json'
with open(filename) as f:numbers = json.load(f)
print(numbers)
4.2 保存和读取用户生成的数据
相关文章:

Python小白入门:文件、异常处理和json格式存储数据
这里写自定义目录标题 所用资料 一、从文件中读取数据1.1 读取整个文件1.2 文件路径1.3 逐行读取1.4 创建一个包含文件各行内容的列表1.5 使用文件的内容1.6 包含一百万位的大型文件1.7 圆周率值中包含你的生日吗练习题 二、写入文件2.1 写入空文件2.2 写入多行2.3 附加到文件练…...

16bit、8 通道、500kSPS、 SAR 型 ADC——MS5188N
MS5188N 是 8 通道、 16bit 、电荷再分配逐次逼近型模数 转换器,采用单电源供电。 MS5188N 拥有多通道、低功耗数据采集系统所需的所有 组成部分,包括:无失码的真 16 位 SAR ADC ;用于将输入配 置为单端输入࿰…...

Chapter 12: Regular expressions | Python for Everybody 讲义笔记_En
文章目录 Python for Everybody课程简介Regular ExpressionsRegular ExpressionsCharacter matching in regular expressionsExtracting data using regular expressionsCombining searching and extractingEscape characterSummaryBonus section for Unix / Linux usersDebugg…...
Android javaMail mergeDebugJavaResource FAILED解决
Java mail 引入这两个jar之后 implementation com.sun.mail:android-mail:1.6.7implementation com.sun.mail:android-activation:1.6.7build直接报错 > Task :app:mergeDebugJavaResource FAILED Execution failed for task :app:mergeDebugJavaResource. > A failure o…...

【ArcGIS Pro二次开发】(57):地图系列
在ArcGIS Pro中,有一个地图系列,可以在一个布局中导出多个地图。 在SDK中为ArcGIS.Desktop.layout.MapSeries类和映射系列导出选项,可以以支持多页导出。 MapSeries类提供了一个静态CreateSpatialMapSeries方法,该方法使用指定的…...
秋招打卡015(20230811)
文章目录 前言一、今天学习了什么?二、动态规划之股票问题1、总结2、题目 三、SQL总结 前言 提示:这里为每天自己的学习内容心情总结; Learn By Doing,Now or Never,Writing is organized thinking. 提示:…...

如何使用Word转PDF转换器在线工具?在线Word转PDF使用方法
Word转PDF转换器在线,是一种方便快捷的工具,可帮助您在不需要下载任何软件的情况下完成此任务。无论您是需要在工作中共享文档,还是将文件以PDF格式保存以确保格式不变,都可以依靠这款在线工具轻松完成转换。那么如何使用Word转PD…...
自然语言处理从入门到应用——LangChain:记忆(Memory)-[记忆的类型Ⅰ]
分类目录:《自然语言处理从入门到应用》总目录 会话缓存记忆ConversationBufferMemory 本节将介绍如何使用对话缓存记忆ConversationBufferMemory。这种记忆方式允许存储消息,并将消息提取到一个变量中,我们首先将其提取为字符串:…...
Camunda 7.x 系列【7】Spring Boot 集成 Camunda 7.19
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. Camunda Platform Run3. Spring Boot 版本兼容性4. 集成 Spring Boot5. 启动项目…...
24华东交通软件工程837考研题库
1.Jackson设计方法是由英国的M.Jackson所提出的。它是一种面向( )的软件设 计方法。 A.对象 B.数据流 C.数据结构 D.控制结构 答案:C 2.软件设计中,Jackson方法是一种面向…...

nginx 以及nginx优化
目录 nginx功能介绍 静态文件服务 反向代理 动态内容处理 SSL/TLS 加密支持 虚拟主机支持 URL 重写和重定向 缓存机制 日志记录 可扩展性和灵活性 nginx的主要应用场景 nginx常用命令 nginx另外一种安装方式 nginx常用的信号符: nginx配置文件详解 n…...

cesium学习记录04-坐标系
一、地理坐标系和投影坐标系的关系 地理坐标系 (Geographic Coordinate System, GCS) 定义:地理坐标系是一个基于三维地球表面的坐标系统。它使用经度和纬度来表示地点的位置。 特点: 使用经纬度来定义位置。 基于特定的地球参考椭球体。 适用于全球范…...
P5737 【深基7.例3】闰年展示
题目描述 输入 x , y x,y x,y,输出 [ x , y ] [x,y] [x,y] 区间中闰年个数,并在下一行输出所有闰年年份数字,使用空格隔开。 输入格式 输入两个正整数 x , y x,y x,y,以空格隔开。 输出格式 第一行输出一个正整数…...
Nacos的安装使用教程Linux
在 Linux 操作系统上安装和使用 Nacos 与 Windows 类似,以下是详细的步骤教程。我们将使用 Nacos 的 Standalone 模式进行安装和使用。请注意,对于生产环境,建议使用集群模式来实现高可用性和可扩展性。 步骤 1:准备环境 Java 安…...
数据结构-学习
参考: 数据结构-学习笔记_蓝净云_蓝净云的博客-CSDN博客...

【MFC】05.MFC六大机制:程序启动机制-笔记
MFC程序开发所谓是非常简单,但是对于我们逆向人员来说,如果想要逆向MFC程序,那么我们就必须了解它背后的机制,这样我们才能够清晰地逆向出MFC程序,今天这篇文章就来带领大家了解MFC的第一大机制:程序启动机…...

Von Maur, Inc EDI 需求分析
Von Maur, Inc 是一家历史悠久的卖场,成立于19世纪,总部位于美国。作为一家知名的零售商,Von Maur 主要经营高端时装、家居用品和美妆产品。其使命是为顾客提供优质的产品和无与伦比的购物体验。多年来,Von Maur 凭借其卓越的服务…...

[深度学习入门]PyTorch深度学习[Numpy基础](上)
目录 一、前言二、Numpy概述三、生成Numpy数组3.1 从已有数据中创建数组3.2 利用random模块生成数组3.3 创建特定形状的多维数组3.4 利用arange和linspace函数生成数组 四、获取元素五、Numpy的算术运算5.1 对应元素相乘5.2 点积运算 六、后记 本文的目标受众: 对机…...
Excel vost 实现照光灯效果
如果你想要在 VSTO(Visual Studio Tools for Office)中实现在 Excel 中添加“照光灯”效果,你需要创建一个 VSTO 插件来实现这个功能。照光灯效果通常是指通过将非活动行或列进行高亮显示,以便更清楚地查看某一行或列的内容。以下…...

IntelliJ中文乱码问题
1、控制台乱码 运行时控制台输出的中文为乱码,解决方法:帮助 > 编辑自定义虚拟机选项… > 此时会自动创建出一个新文件,输入:-Dfile.encodingUTF-8,然后重启IDE即可,操作截图如下: 2、…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...