Python3 基础学习笔记 C09【文件和异常】

CSDN 课程推荐:《8小时Python零基础轻松入门》,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员;已出版《跟老齐学Python:轻松入门》《跟老齐学Python:Django实战》、《跟老齐学Python:数据分析》和《Python大学实用教程》畅销图书。


Python3 基础学习笔记第九章【文件和异常】

目录

  • 【9.1】从文件中读取数据
    • 【9.1.1】读取整个文件
    • 【9.1.2】文件路径
    • 【9.1.3】逐行读取
    • 【9.1.4】创建一个包含文件各行内容的列表
    • 【9.1.5】使用文件的内容
  • 【9.2】写入文件
  • 【9.3】使用 try-except 代码块处理异常
  • 【9.4】储存数据
    • 【9.4.1】使用 json.dump() 和 json.load()
    • 【9.4.2】重构


【9.1】从文件中读取数据

【9.1.1】读取整个文件

有一个文件,包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行:

Circumference rate.txt
-----------------------
3.141592653589793238462643383279

以下两个程序将打开并读取这个文件,再将其内容显示到屏幕上:

#file_reader.pywith open('Circumference rate.txt') as file_object:contents = file_object.read()print(contents)
#file_reader2.pycontents = open ('Circumference rate.txt')
print(contents.read())
contents.close()

函数open()接受一个参数:要打开的文件的名称,Python在当前执行的文件所在的目录中查找指定的文件;关键字with在不再需要访问文件后将其关闭;也可以调用open()close()来打开和关闭文件,如果使用这种方法,当程序存在bug时,close()语句未执行,文件将不会被关闭;方法read()将读取这个文件的全部内容,并将其作为一个长长的字符串储存在变量contents中,通过打印contents的值,就可以将这个文本文件的全部内容打印出来:

3.141592653589793238462643383279

输出结果末尾有一空行,这是因为read()到达末尾时返回一个空字符串,而将这个空字符串显示出来就是一个空行,如果要删除末尾的空行,可在print语句中使用rstrip():

#file_reader.pywith open('Circumference rate.txt') as file_object:contents = file_object.read()print(contents.rstrip())

输出结果如下:

3.141592653589793238462643383279

【9.1.2】文件路径

相对文件路径:假定程序文件位于python_work文件夹中,程序文件操作的文本文件位于python_work文件夹的子文件夹text_files中,此时可以使用相对文件路径来打开该文本文件,相对文件路径让Python到指定的位置去查找,而该位置是相对于当前运行的程序所在目录的

在Linux和OS X中,相对路径类似于如下:

with open('text_files/filename.txt') as file_object:

在Windows系统中,文件路径中使用反斜杠(\)而不是斜杠(/):

with open('text_files\filename.txt') as file_object:

绝对文件路径:不用关心当前运行的程序储存在什么地方,直接将文件在计算机中的准确位置告诉Python,这称为绝对文件路径,绝对路径通常比相对路径更长,因此将其储存在一个变量中,再将变量传递给open()会有所帮助

在Linux和OS X中,绝对路径类似于如下:

file_path = '/home/ehmatthes/other_files/text_files/filename.txt'
with open(file_path) as file_object:

在Windows系统中,绝对路径类似于如下:

file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt'
with open(file_path) as file_object:

【9.1.3】逐行读取

要以每次一行的方式检查文件,可对文件对象使用for循环:

#file_reader.pyfilename = 'Circumference rate.txt'
with open(filename) as file_object:for line in file_object:print(line)

在文件中每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,一个来自print语句,输出结果如下:

3.141592653589793238462643383279

要消除这些多余的空白行,可以使用rstrip():

#file_reader.pyfilename = 'Circumference rate.txt'
with open(filename) as file_object:for line in file_object:print(line.rstrip())

输出结果如下:

3.141592653589793238462643383279

【9.1.4】创建一个包含文件各行内容的列表

使用关键字with时,open()返回的文件对象只在with代码块内可用,如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行储存在一个列表当中,并在with代码块外使用该列表:

#file_reader.pyfilename = 'Circumference rate.txt'
with open(filename) as file_object:lines = file_object.readlines()for line in lines:print(line.rstrip())

输出结果与文件内容完全一致

【9.1.5】使用文件的内容

创建一个字符串,它包含文件中储存的所有数字,且没有任何空格:

#pi_string.pyfilename = 'Circumference rate.txt'
with open(filename) as file_object:lines = file_object.readlines()pi_string = ''
for line in lines:pi_string += line.rstrip()print(pi_string)
print(len(pi_string))

打印该字符串以及其长度:

3.1415926535  8979323846  2643383279
36

由于原文件每行左边都有空格,我们可以使用strip()而不是rstrip()来删除它:

#pi_string.pyfilename = 'Circumference rate.txt'
with open(filename) as file_object:lines = file_object.readlines()pi_string = ''
for line in lines:pi_string += line.strip()print(pi_string)
print(len(pi_string))

输出结果如下:

3.141592653589793238462643383279
32

Python中有三个去除头尾字符、空白符的函数,它们依次为:
strip:用来去除头尾字符、空白符(包括\n、\r、\t、’ ‘,即:换行、回车、制表符、空格)
lstrip:用来去除开头字符、空白符(包括\n、\r、\t、’ ‘,即:换行、回车、制表符、空格)
rstrip:用来去除结尾字符、空白符(包括\n、\r、\t、’ ‘,即:换行、回车、制表符、空格)
注意:这些函数都只会删除头和尾的字符,中间的不会删除。
用法分别为:
string.strip([chars])
string.lstrip([chars])
string.rstrip([chars])
参数chars是可选的,当chars为空,默认删除string头尾的空白符(包括\n、\r、\t、’ ')
当chars不为空时,函数会被chars解成一个个的字符,然后将这些字符去掉
它返回的是去除头尾字符(或空白符)的string副本,string本身不会发生改变

【9.2】写入文件

将一条简单的消息储存到文件中:

#write_message.pyfilename = 'programming.txt'
with open(filename,'w') as file_object:file_object.write("I love programming!")

调用open()时提供了两个实参,第一个实参也是要打开文件的名称,第二个实参(‘w’)告诉Python,我们要以写入模式打开这个文件,打开文件时,可指定读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)或者让我们能够读取和写入文件的模式(‘r+’),如果省略模式实参,则默认以只读模式打开文件

附表:Python读写文件各种模式区别
模式可做操作若文件不存在是否覆盖
r打开一个文件用于只读报错-
rb以二进制格式打开一个文件用于只读报错-
r+打开一个文件用于读和写报错否,追加写
rb+以二进制格式打开一个文件用于读和写报错否,追加写
w打开一个文件用于只写创建
wb以二进制格式打开一个文件只用于只写创建
w+打开一个文件用于读和写创建
wb+以二进制格式打开一个文件用于读和写创建
a打开一个文件用于追加创建否,追加写
ab以二进制格式打开一个文件用于追加创建否,追加写
a+打开一个文件用于读和写创建否,追加写
ab+以二进制格式打开一个文件用于追加创建否,追加写

【9.3】使用 try-except 代码块处理异常

当我们尝试将一个数字除以0时,会发生ZeroDivisionError异常:

>>> print(5/0)
Traceback (most recent call last):File "<pyshell#0>", line 1, in <module>print(5/0)
ZeroDivisionError: division by zero

此时我们可以编写一个try-except代码块来处理该异常:

try:print(5/0)
except ZeroDivisionError:print("You can't divide by zero!")

当我们运行该程序时,会出现提示:

You can't divide by zero!

try-except代码块中加入else,编写一个只执行除法运算的简单计算器:

print("Give me two numbers,and I'll divide them.")
print("Enter 'q' to quit.")while True:first_number = input("\nFirst number:")if first_number == 'q':breaksecond_number = input("\nSecond number:")if second_number == 'q':breaktry:answer = int(first_number)/int(second_number)except ZeroDivisionError:print("You can't divide by 0!")else:print(answer)

运行程序:

Give me two numbers,and I'll divide them.
Enter 'q' to quit.First number:45Second number:0
You can't divide by 0!First number:36Second number:8
4.5First number:q

若不加入try-except代码块,我们在输入0时,程序就会出现异常而崩溃,而try-except代码块很好的解决了这种问题,而且还起到了提示的作用,同样的,try-except代码块也可以处理其他异常,如FileNotFoundError

【9.4】储存数据

【9.4.1】使用 json.dump() 和 json.load()

模块json能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据;编写一个储存一组数字的简短程序,再编写一个将这些数字读取到内存中的程序,第一个程序将使用 json.dump()来储存这组数据,而第二个程序将使用 json.load()。函数 json.dump()接受两个实参:要储存的数据以及可用于储存数据的文件对象:

#number_writer.pyimport jsonnumbers = [2,3,5,7,11,13]filename = 'numbers.json'
with open(filename,'w') as f_obj:json.dump(numbers,f_obj)

先导入模块json,再创建一个数字列表, 通常用文件扩展名.json来指出文件储存的数据为JSON格式,然后以写入模式打开该文件,使用函数json.dump()将数字列表储存到文件numbers.json中,打开该文件,数据的储存格式与Python一样:

[2, 3, 5, 7, 11, 13]

再编写一个程序,使用json.load()将这个列表读取到内存中:

#number_reader.pyimport jsonfilename = 'numbers.json'
with open(filename) as f_obj:numbers = json.load(f_obj)
print(numbers)

输出结果与number_writer.py中创建的数字列表相同:

[2, 3, 5, 7, 11, 13]

进阶:在同一个程序中使用 json.dump()json.load():创建文件username.json储存用户名,从该文件中获取用户名,如果这个文件不存在,就在except代码块中提示用户输入用户名,并将其储存在username.json中:

#remember_me.pyimport json#如果以前储存了用户名,就加载它
#否则就提示用户输入用户名并储存它
filename = 'numbers.json'
try:with open(filename) as f_obj:username = json.load(f_obj)
except FileNotFoundError:username = input("What's your name?")with open(filename,'w') as f_obj:json.dump(username,f_obj)print("We'll remember you when you come back, " + username + "!")
else:        print("Welcome back, " + username + "!")

以前没有储存用户名,第一次运行程序:

What's your name?TRHX
We'll remember you when you come back, TRHX!

再次运行程序:

Welcome back, TRHX!

【9.4.2】重构

代码能够正确运行,但可以做进一步的改进——将代码划分为一系列完成具体工作的函数,这样的过程称为重构,重构让代码更清晰、更易于理解、更容易扩展
重构remember_me.py,将大部分逻辑放到一个或者多个函数中:

#remember_me.pyimport jsondef greet_user():#问候用户,并指出其名字filename = 'numbers.json'try:with open(filename) as f_obj:username = json.load(f_obj)except FileNotFoundError:username = input("What's your name?")with open(filename,'w') as f_obj:json.dump(username,f_obj)print("We'll remember you when you come back, " + username + "!")else:        print("Welcome back, " + username + "!")greet_user()

重构greet_user(),让它不执行这么多任务——将获取储存的用户名的代码移到另一个函数中:

#remember_me.pyimport jsondef get_stored_username():#如果储存了用户名,就获取它filename = 'numbers.json'try:with open(filename) as f_obj:username = json.load(f_obj)except FileNotFoundError:return Noneelse:return usernamedef greet_user():#问候用户,并指出其名字username = get_stored_username()if username:print("Welcome back, " + username + "!")else:username = input("What's your name?")filename = 'username.json'with open(filename,'w') as f_obj:json.dump(username,f_obj)print("We'll remember you when you come back, " + username + "!")     greet_user()

将greet_user()中的另一个代码块提取出来:将没有储存用户名时提示用户输入的代码放在一个独立的函数中:

#remember_me.pyimport jsondef get_stored_username():#如果储存了用户名,就获取它filename = 'numbers.json'try:with open(filename) as f_obj:username = json.load(f_obj)except FileNotFoundError:return Noneelse:return usernamedef get_new_username():#提示输入用户名username = input("What's your name?")filename = 'username.json'with open(filename,'w') as f_obj:json.dump(username,f_obj)return usernamedef greet_user():#问候用户,并指出其名字username = get_stored_username()if username:print("Welcome back, " + username + "!")else:username = get_new_username()print("We'll remember you when you come back, " + username + "!")     greet_user()

最终版本实现了每个函数只负责单一而清晰的任务,我们在编写程序时也要像这样,要写出清晰而易于维护和扩展的代码

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

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

相关文章

REVERSE-PRACTICE-CTFSHOW-7

REVERSE-PRACTICE-CTFSHOW-7签层饼Tea_tube_poteasy贪吃蛇的秘密签层饼 32位exe&#xff0c;ida打开 main函数中&#xff0c;输入两个大于0的数字&#xff0c;如果flag_num为0&#xff0c;则将两个输入作为flag的一部分&#xff0c;打印flag 选中input_1按x查找交叉引用&…

HttpModule与HttpHandler详解(转)

ASP.NET对请求处理的过程&#xff1a; 当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll会通过http管道&am…

Windows 系统中 Python下 Pygame 的安装

Pygame是跨平台Python模块&#xff0c;专为电子游戏设计&#xff0c;可用于管理图形、动画乃至声音&#xff0c;建立在SDL基础上&#xff0c;允许实时电子游戏研发而无需被低级语言&#xff08;如机器语言和汇编语言&#xff09;束缚&#xff0c;通过使用Pygame来处理在屏幕上绘…

REVERSE-PRACTICE-CTFSHOW-8

REVERSE-PRACTICE-CTFSHOW-8Matara OkinaanniuwarmupeMatara Okina apk文件&#xff0c;jadx-gui打开 MainActivity什么都没有&#xff0c;来到FlagActivity scheme&#xff0c;host这些看不懂 第44行有个ans和bytes的比较&#xff0c;ans已知&#xff0c;bytes是从某个地方获…

Html控件和Web控件(转)

作为一名ASP.NET的初学者&#xff0c;了解并且区别一些混淆概念是很必须的&#xff0c;今天这篇博文 就是主要向大家介绍一下Html控件和Web控件。在ASP.net中&#xff0c;用户界面控件主要就是 Html控件和Web控件&#xff0c;在前台页面上看&#xff0c;两种控件非常相似&…

VMware Pro 14 安装 Ubuntu 18.04 详细教程

目录● 安装步骤1.下载安装 VMware Workstation Pro 142.下载 Ubuntu 18.04 系统3.在 VMware 中创建虚拟机4.在虚拟机上安装 Ubuntu 系统● 安装过程中可能会出现的一些问题 1.在虚拟机上安装 Ubuntu 系统的过程中卡死不动 2.Ubuntu 不能全屏显示● 安装步骤 1.下载安装 VMware…

C语言实现TEA系列加解密算法

C语言实现TEA系列加解密算法TEA加解密XTEA加解密XXTEA加解密TEA加解密 #include <stdio.h> #include <stdint.h>//加密函数 void encrypt(uint32_t* v, uint32_t* k) {uint32_t v0 v[0], v1 v[1], sum 0, i;uint32_t delta 0x9e3779b9;uint32_t k0 k[0], k1 …

Web服务器控件和HTML控件的区别与联系

我们知道&#xff0c;在ASP.NET中&#xff0c;使用了两类控件&#xff0c;一类是HTML控件&#xff0c;还有一类是WEB控件。 WEB控件我们已经很熟悉&#xff0c;因为它是ASP.NET提供&#xff0c;一般关于ASP.NET的教程文章都会仔细介绍这些控件的详细应用技巧&#xff1b; 而H…

Hexo 博客优化之博客美化系列(持续更新)

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/&#xff0c;文章距上次编辑时间较远&#xff0c;部分内容可能已经过时&#xff01; 本文将讲述一些 Hexo 博客的美化&#xff0c;本文以作者 luuman 的 spfk 主题和作者 xaoxuu 的 Material X 主题为例…

C语言实现AES加解密算法

C语言实现AES加解密算法AES加解密AES加解密 #include <stdio.h> #include <stdint.h> #include <memory.h> /****************************************************************************************************************/ typedef enum {AES_CYPH…

一台电脑部署两个或多个 Hexo 博客(一台电脑使用两个或多个 GitHub 账号)

由于个人原因需要在一台电脑上部署两个Hexo博客&#xff0c;本来以为挺简单&#xff0c;没想到问题重重&#xff0c;首先是一个GitHub账号只能搭建一个Hexo博客&#xff0c;因此就需要使用其他GitHub账号&#xff1b;其次是一台电脑绑定两个GitHub账号&#xff0c;则需要两对公…

详解ASP.NET页面生命周期事件

下面是ASP.NET页面初始的过程: 1. Page_Init(); 2. Load ViewState; 3. Load Postback data; 4. Page_Load(); 5. Handle control events; 6. Page_PreRender(); 7. Page_Render(); 8. Unload event; 9. Dispose method called; 下面对其中的一些过程作下描述&#xff1a;1. P…

C语言实现DES加解密算法

C语言实现DES加解密算法DES加解密DES加解密 #include <stdio.h> #include <stdlib.h> #include <string.h> /*--------------------------------------------------------------------------------------------------------------*/ typedef unsigned char …

33种编程语言为您送上祝福,新年快乐!

又是新的一年&#xff0c;没什么好说的&#xff0c;就用33种编程语言为大家送上祝福吧&#xff01;Cprintf("2019&#xff0c;祝大家");Ccout<<"一帆风顺";C#System.Console.WriteLine("二龙腾飞")VBMsg("三羊开泰")VCMessageBo…

IsPostBack须要注意的地方,这些都不是POSTBACK动作

page.IsPostBack属性 简要概述: IsPostBack 字面意思理解为:是回滚,那如果不是回滚,那就是首次加载! (!page.ispostback)理解为:不是回滚,值为:true. if(!page.ispostback) //首次加载 { //如果是第一次加载,就执行此内容. } else{非首次加载页面} 1 IsPostBack介…

C语言实现RC4加解密算法

C语言实现RC4加解密算法RC4加解密RC4加解密 #include<stdio.h>/* RC4初始化函数 */ void rc4_init(unsigned char* s, unsigned char* key, unsigned long Len_k) {int i 0, j 0;char k[256] { 0 };unsigned char tmp 0;for (i 0; i < 256; i) {s[i] i;k[i] k…

element.style内联样式修改

最近在修改我个人博客的一个样式时发现&#xff0c;无论我如何修改style里面的值&#xff0c;页面上的样式都不会被修改&#xff0c;F12检查一下发现个element.style&#xff0c;但是却找不到这个值在哪里&#xff0c;查资料后才知道element.style为内联样式&#xff0c;基本很…

if(!ispostback)其用法和作用 什么时候该用?

&#xff08;1&#xff09;if (!IsPostBack) 里面的代码只执行一遍&#xff0c;即页面第一次加载时。 &#xff08;2&#xff09;以后页面重新刷新时&#xff0c;if (!IsPostBack)里面的语句不执行。 &#xff08;3&#xff09;首次建立页面 IsPostBack为false&#xff0c;用来…

C语言实现SM4加解密算法

C语言实现SM4加解密算法SM4加解密SM4加解密 #include <string.h> #include <stdio.h> #include <time.h> /*--------------------------------------------------------------------------------------------------------------*/ #define SM4_ENCRYPT …

免费CDN:jsDelivr+Github 使用方法

CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。CDN是构建在网络之上的内容分发网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c;降低网络拥塞&…