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 保存和读取用户生成的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/84913.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云轻量应用服务器地域有什么区别?怎么选?

腾讯云轻量应用服务器地域是指轻量服务器数据中心所在的地理位置,如上海、广州和北京等地域,如何选择地域?地域的选择建议就近原则,用户距离轻量服务器地域越近,网络延迟越低,速度就越快,根据用…

教程分享:如何制作一个旅游路线二维码?

吃一成不变的早餐,九点出门还会遇见楼下遛狗的大爷,老板掐着表发起了会议邀请,窗外还是那几棵树,天空依旧灰蒙蒙的,羊了个羊第二关还是过不去,理发店的小哥又倚在门口抽烟…… 大多时候,我们的…

SpringBoot笔记:SpringBoot 集成 Dataway 多数据源配置(二)

文章目录 前言核心代码和配置yml 配置注入多数据源常用Spi实现swagger 配置自定义 Udf指定数据源进行查询 前言 之前简单介绍了一下 Dataway 使用,本文继续介绍一下它的多数据源配置和使用。 核心代码和配置 yml 配置 # springboot多环境配置 #端口,…

3D Web轻量化引擎HOOPS Communicator如何实现对BIM桌面端的支持?

HOOPS Communicator是一款简单而强大的工业级高性能3D Web轻量化渲染开发包,其主要应用于Web领域,主要加载其专有的SCS、SC、SCZ格式文件;HOOPS还拥有另一个桌面端开发包HOOPS Visualize,主要加载HSF、HMF轻量化格式文件。两者虽然…

git一次错误merge的回滚

场景:提交到sit的代码,结果解决冲突merge了DEV的代码,所以要回滚到合并之前的代码 (原因是我再网页上处理了冲突,他就自动merge了,如图—所以还是idea处理冲突,可控) 方式二: &…

详解C语言函数:深入了解函数的使用和特性

目录 引言 一、函数的概念 1.1 函数关键特点 1.2 函数的组成部分 1.3 函数声明和定义格式 二、函数分类 2.1 库函数 使用库函数的步骤 2.2 自定义函数 创建自定义函数的步骤 三、函数的参数类型 3.1 形式参数(形参): 格式&#x…

springboot工程集成前端编译包,用于uni-app webView工程,解决其需独立部署带来的麻烦,场景如页面->画布->图片->pdf

前端工程 访问方式 http://127.0.0.1:8080/context/frontEnd/index放行 public class SecurityConfig extends WebSecurityConfigurerAdapter { "/frontEnd/**",SysFrontEndController import lombok.extern.slf4j.Slf4j; import nl.basjes.shaded.org.springfram…

【Mybatis】调试查看执行的 SQL 语句

1. 问题场景: 记录日常开发过程中 Mybatis 调试 SQL 语句,想要查看Mybatis 中执行的 SQL语句,导致定位问题困难 2. 解决方式 双击shift找到mybatis源码中的 MappedStatement的getBoundSql()方法 public BoundSql getBoundSql(Object para…

leetcode - 75. 颜色分类(java)

颜色分类 leetcode - 75. 颜色分类题目描述双指针代码演示 双指针算法专题 leetcode - 75. 颜色分类 难度 - 中等 原题链接 - 颜色分类 题目描述 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻&…

栈和队列详解(1)

目录 一、什么是栈? 二、创建一个我们自己的栈 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化栈结构体 2.2尾插(压栈) 2.3栈存放的元素个数和判断栈是否为空 2.4获取栈顶元素 2.5出栈 2.6摧毁栈 2.7测试接口 三、…

Java基础入门篇——IDEA开发第一个入门程序(五)

目录 一、IDEA层级结构分类 二、IDEA层级结构介绍 三、IDEA层级关系 四、创建IDEA中的第一个代码 一、IDEA层级结构分类 IntelliJ IDEA的项目结构主要分为以下几个层级: Project: 项目Module: 模块Package: 包Class: 类 一个项目里面…

预测赢家(力扣)dfs + 备忘录 JAVA

给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。 玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0]…

【LeetCode】45. 跳跃游戏 II - 贪婪算法

目录标题 2023-8-11 09:49:25 45. 跳跃游戏 II 2023-8-11 09:49:25 自己没做出来&#xff0c;废物Orz class Solution {public int jump(int[] nums) {int length nums.length;int end 0;int maxPosition 0;int steps 0;for (int i 0; i < length - 1; i) {maxPosit…

首批获得金融级行业云平台认证,天翼云深耕行业云

云计算下半场看什么&#xff1f; 无疑是金融、政务、制造等传统政企用户的上云与用云。随着数字经济发展和产业数字化的提速&#xff0c;上云已是政企用户推动其数字化转型不断深入的重要抓手&#xff0c;成为不可阻挡的趋势。 与互联网用户相比&#xff0c;政企用户上云极为…

从数据仓库到数据结构:数据架构的演变之路

在上个世纪&#xff0c;从电子商务巨头到医疗服务机构和政府部门&#xff0c;数据已成为每家组织的生命线。有效地收集和管理这些数据可以为组织提供宝贵的洞察力&#xff0c;以帮助决策&#xff0c;然而这是一项艰巨的任务。 尽管数据很重要&#xff0c;但CIOinsight声称&…

那些年的Java开发经验记录

Java同步锁(浅显易懂&#xff0c;精简讲解) 详细讲解可以看这篇文章Java对象锁和类锁全面解析&#xff08;多线程synchronized关键字&#xff09; 精简如下&#xff1a; 1.不管什么锁&#xff0c;都是属于对象锁(类也是一种对象) 2.一个对象只有一个锁 3.锁最大可以锁整个…

【框架类】—Vue3的生命周期

一、生命周期的相关函数 onBeforeMount 页面渲染之前 和 onMounted渲染之后 示例 <template><div class"test"><div ref"el">组件初始化</div></div> </template> <script> //按需引入所需方法 import { ref,…

Redux - Redux在React函数式组件中的基本使用

文章目录 一&#xff0c;简介二&#xff0c;安装三&#xff0c;三大核心概念Store、Action、Reducer3.1 Store3.2 Reducer3.3 Action 四&#xff0c;开始函数式组件中使用4.1&#xff0c;引入store4.1&#xff0c;store.getState()方法4.3&#xff0c;store.dispatch()方法4.4&…

04-4_Qt 5.9 C++开发指南_时间日期与定时器

文章目录 1. 时间日期相关的类2. 源码2.1 可视化UI设计2.2 dialog.h2.3 dialog.cpp 1. 时间日期相关的类 时间日期是经常遇到的数据类型&#xff0c;Qt 中时间日期类型的类如下。 QTime:时间数据类型&#xff0c;仅表示时间&#xff0c;如 15:23:13。 QDate:日期数据类型&…

虹科方案 | 汽车总线协议转换解决方案

汽车总线&#xff1a; 汽车总线是一种用于在车辆电子系统中传输数据和控制信息的通信系统。它允许不同的电子控制单元&#xff08;ECU&#xff09;在车辆中相互通信&#xff0c;协调各个系统的操作&#xff0c;以实现功能的集成和协同工作。 在现代汽车中&#xff0c;综合通信…