python学习(六)----文件和异常
文章目录
- 学习教材
- 第十章 文件和异常
- 1、从文件中读取数据
- 写入文件
- 附加到文件
- 处理 ZeroDivisionError 异常
- 处理 FileNotFoundError 异常
- 分析文本
- 失败时一声不吭--pass
- 使用模块json来存储数据
- 保存和读取用户生成的数据
学习教材
第十章 文件和异常
1、从文件中读取数据
下面首先来创建一个文件,它包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行。保存为yzl.txt
与程序放在同一个目录下
在test.py中写
with open('yzl.txt') as file_object:con=file_object.read()print(con)
在这个程序中,第1行代码with open('yzl.txt') as file_object:
。
函数open()接受一个参数:要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。在这个示例中,当前运行的是test.py,因此Python在test.py所在的目录中查找yzl.txt。
函数open()返回一个表示文件的对象。在这里,open('yzl.txt')
返回一个表示文件yzl.txt的对象;Python将这个对象存储在我们将在后面使用的变量中。
关键字with
在不再需要访问文件后将其关闭。
在这个程序中,注意到我们调用了open(),但没有调用close();你也可以调用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug,导致close()语句未执行,文件将不会关闭。这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损。如果在程序中过早地调用close(),你会发现需要使用文件时它已关闭(无法访问),这会导致更多的错误。并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。
有了表示yzl.txt的文件对象后,我们使用方法read()读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量con中。这样,通过打印con的值,就可将这个文本文件的全部内容显示出来:
输出结果:
3.1415926535
8979323846
2643383279
相比于原始文件,该输出唯一不同的地方是末尾多了一个空行。为何会多出这个空行呢?因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在print语句中使用rstrip():
print(con.rstrip())
前面说过,Python方法rstrip()删除(剥除)字符串末尾的空白。现在,输出与原始文件的内容完全相同
文件路径
另外,如果你学过其他的语言,那么到这里你应该有经验了,我们刚才的程序,传给open
的是文件名,所以只能在当前执行文件的目录下查找,如果我们想要读取的文件在别的地方,那么我们可以传给open
绝对路径。
注意,在Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/:在Linux和OS X中使用):
with open('D:\yzl.txt') as file_object:con=file_object.read()print(con.rstrip())
逐行读取
要以每次一行的方式检查文件,可对文件对象使用for循环
with open('D:\yzl.txt') as file:for line in file:print(line)
输出结果
我们发现,空白行更多了。为何会出现这些空白行呢?因为在这个文件中,每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print语句。要消除这些多余的空白行,可在print语句中使用rstrip():
print(line.rstrip())
输出结果:
3.1415926535
8979323846
2643383279
读取文件存入列表
使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表
filename='D:\yzl.txt'
with open(filename) as file:lines=file.readlines()for line in lines:print(line.rstrip())
方法readlines()
从文件中读取每一行,并将其存储在一个列表中;接下来,该列表被存储到变量lines中;在with代码块外,我们依然可以使用这个变量
处理和使用我们读取到的数据
#读取文件中的数据
filename='D:\yzl.txt'
with open(filename) as file:lines=file.readlines()
#将读取的数据 去除换行 存入字符串pi
pi=''
for line in lines:pi+=line.strip()
#打印字符串pi
print(len(pi))
print(pi)
输出结果:
32
3.141592653589793238462643383279
ps:读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转换为浮点数。
处理大型文件
如果你学过C语言,那么就会了解一个难题,那就是大数问题,由于数据类型的限制,太大的数字我们存不下,即使存为字符串,也是有上限的,只能存数据类型对应范围内的字符串。
而python呢,刚才我们分析的都是一个只有三行的文本文件,但这些代码示例也可处理大得多的文件。
如果我们有一个文本文件,其中包含精确到小数点后1 000 000位而不是30位的圆周率值,也可创建一个包含所有这些数字的字符串。为此,我们无需对前面的程序做任何修改,只需将这个文件传递给它即可。
对于你可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。
即使是面对一百万位圆周率的文件,你也可以用普通的方法去处理他,如下:
#读入一个包含了前一百万位圆周率的文件
filename='D:\yzl.txt'
with open(filename) as file:lines=file.readlines()pi=''
for line in lines:pi+=line.strip()#判断你的生日是否出现在前一百万位圆周率里面
birthday='1204'
if birthday in pi:print('yes')
else:print('no')
写入文件
要将文本写入文件,你在调用open()时需要提供另一个实参w
,告诉Python你要写入打开的文件
fileName='D:\yzl.txt'
with open(fileName,'w') as file:file.write('I love you')
打开文件时,可指定读取模式('r')
、写入模式('w')
、附加模式('a')
或让你能够读取和写入文件的模式('r+')
。
如果你省略了模式实参,Python将以默认的只读模式打开文件。
上面这个例子中第二个实参('w')
就是告诉Python,我们要以写入模式打开这个文件。
如果你要写入的文件不存在,函数open()将自动创建它。然而,以写入(‘w’)模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。
注意:Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。
如果你想为文件写入多行,需要在write
中加入换行符号
fileName='D:\holly.txt' #指定文件若不存在 会自动创建
with open(fileName,'w') as file:file.write('I love you\n')file.write('And you ?\n')
附加到文件
如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式打开文件。你以附加模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。如果指定的文件不存在,Python将为你创建一个空文件。
为刚才的文件附加一句话
fileName='D:\holly.txt'
with open(fileName,'a') as file:file.write('Yes,I do')
输出结果:
处理 ZeroDivisionError 异常
我们都知道不能将一个数字除以0。所以你如果用python进行这样的操作,你将看到一个traceback:
Traceback (most recent call last):
File “division.py”, line 1, in < module >
print(5/0)
ZeroDivisionError: division by zero
在上述traceback中,处指出的错误ZeroDivisionError是一个异常对象。Python无法按你的要求做时,就会创建这种对象。在这种情况下,Python将停止运行程序,并指出引发了哪种异常,而我们可根据这些信息对程序进行修改。
使用 try-except 代码块
编写一个try-except代码块来处理可能引发的异常
a=int(input())
b=int(input())
try:ans=a/b
except ZeroDivisionError:print("you can't divide by zero!")
else: #若为引发异常 则进行else代码print(ans)
输出结果:
5
0
you can’t divide by zero!
2
3
0.6666666666666666
我们将导致错误的代码行print(5/0)
放在了一个try代码块中。如果try代码块中的代码运行起来没有问题,Python将跳过except代码块;如果try代码块中的代码导致了错误,Python将查找这样的except代码块,并运行其中的代码,即其中指定的错误与引发的错误相同。
在这个示例中,try代码块中的代码引发了ZeroDivisionError异常,因此Python指出了该如何解决问题的except代码块,并运行其中的代码。这样,用户看到的是一条友好的错误消息,而不是traceback
依赖于try代码块成功执行的代码都应放到else代码块中,这样当出现异常的时候,说明try中代码没有成功,那么后边的也不可以执行。
处理 FileNotFoundError 异常
使用文件时,一种常见的问题是找不到文件:你要查找的文件可能在其他地方、文件名可能不正确或者这个文件根本就不存在。
对于所有这些情形,都可使用try-except代码块以直观的方式进行处理。
我们来尝试读取一个不存在的文件。在只读模式下,并不会为你自动创建文件
fileName='alice.txt'
with open(fileName) as file:file.read()
输出结果:FileNotFoundError: [Errno 2] No such file or directory: ‘alice.txt’
fileName='alice.txt'
try:with open(fileName) as file:file.read()
except FileNotFoundError:msg= "Sorry, the file " + fileName + " does not exist." print(msg)
输出结果:Sorry, the file alice.txt does not exist.
分析文本
你可以分析包含整本书的文本文件。
split()方法
方法split()
以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。结果是一个包含字符串中所有单词的列表,虽然有些单词可能包含标点。
txt="and don't peep into"
a=txt.split()
print(a)
输出结果:
[‘and’, “don’t”, ‘peep’, ‘into’]
我找了一段英文文本,存在了test.txt文件中,我们写一个函数,来分析他有多少个单词
代码如下
def count_words(filename):try:with open(filename) as file:con=file.read()except FileNotFoundError:msg = "Sorry, the file " + filename + " does not exist."print(msg)else:words=con.split()num_words=len(words)print("The file " + filename + " has about "+str(num_words)+" words")filename='D:/test.txt'
count_words(filename)
输出结果:
The file D:/test.txt has about 221 words
这里我们把处理文本的代码封装成了一个函数,还写了异常处理办法,这样做有一个好处,就是可以让我们批量分析文本文件
我们把文件路径存入一个列表,用一个for循环来批量处理
filenames=['D:/test.txt','alice.txt','user.txt']
for filename in filenames:count_words(filename)
输出结果:
The file D:/test.txt has about 221 words
Sorry, the file alice.txt does not exist.
Sorry, the file user.txt does not exist.
即使后两个路径不存在,程序也不会崩溃,不影响处理下边的文件
失败时一声不吭–pass
有时候你希望程序在发生异常时一声不吭,就像什么都没有发生一样继续运行。要让程序在失败时一声不吭,可像通常那样编写try代码块,但在except代码块中明确地告诉Python什么都不要做。Python有一个pass语句,可在代码块中使用它来让Python什么都不要做
def count_words(filename):try:with open(filename) as file:con=file.read()except FileNotFoundError:pass #失败时一声不吭else:words=con.split()num_words=len(words)print("The file " + filename + " has about "+str(num_words)+" words")filenames=['D:/test.txt','alice.txt','D:/test.txt']
for filename in filenames:count_words(filename)
输出结果:
The file D:/test.txt has about 221 words
The file D:/test.txt has about 221 words
中间那个文件路径'alice.txt'
不存在,发生了异常,但是程序并未给出任何提示
pass语句还充当了占位符,它提醒你在程序的某个地方什么都没有做,并且以后也许要在这里做些什么。
使用模块json来存储数据
模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。你还可以使用json在Python程序之间分享数据。更重要的是,JSON数据格式并非Python专用的,这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。
使用 json.dump()
函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
import json
nums=[2,3,4,5,6,7,8]
filename='num.json'
with open(filename,'w') as file:json.dump(nums,file)
执行完了以后,我们打开num.json
文件查看内容
使用 json.load()
刚才我们用json.dump
存储了那个列表,现在我们打开他
import jsonfilename='num.json'
#以只读方式打开刚才的文件
with open(filename) as file:nums=json.load(file)
print(nums)
我们确保读取的是前面写入的文件。这次我们以读取方式打开这个文件。我们使用函数json.load()加载存储在numbers.json中的信息,
并将其存储到变量numbers中。最后,我们打印恢复的数字列表。
[2, 3, 4, 5, 6, 7, 8]
与刚才存入的一致,这是一种在程序之间共享数据的简单方式。
保存和读取用户生成的数据
import jsonfilename='username.json'
try:with open(filename) as file: #如果可以读取用户信息 直接执行elseusername=json.load(file)
except FileNotFoundError: #读取不到用户信息username=input("What is your name?") #请用户输入信息 并存储with open(filename,'w') as file:json.dump(username,file)print("We'll remember you when you come back, " + username + "!")
else:print("Welcome back, " + username + "!")
这个程序第一次执行的时候
What is your name?juli
We’ll remember you when you come back, juli!
第二次运行的时候
Welcome back, juli!
python学习(六)----文件和异常相关推荐
- [Python学习日记] 文件与文件系统(一)
[Python学习日记] 文件与文件系统(一) 目录 Python3 File(文件) 方法 open() 方法 file 对象 目录 Python3 File(文件) 方法 open() 方法 Py ...
- Python入门(13)——文件和异常
在开发中经常要对数据进行持久化操作,实现数据持久化最直接的方式就是将数据保存到文件中.在 Python 中实现文件的读写操作非常简单,通过 Python 内置的函数,就可以获得操作文件的对象,从而对文 ...
- Android学习——R文件丢失异常原因汇总
Console报错:R.java was modified manually! Reverting to generated version! 引言: R文件丢失异常在java开发中是个比较常见的异常 ...
- python学习之文件处理
Table of Contents 图片成批resize 多个文件夹中某文件,都保存到另一文件夹中 多个文件夹中某文件,都保存到另一文件夹中,并重命名 多个文件夹中,1/4数据用做测试集,其它用作训练 ...
- python 实验九 文件与异常
1.新建一个文本文件yzy.txt,文件内容如下 慈母手中线,游子身上衣. 临行密密缝,意恐迟迟归. 谁言寸草心,报得三春晖. 编写程序输出该文件的内容,要求使用一次性读入整个文件内容和逐行读取文件内 ...
- python 文件操作不被打断_python学习六文件操作和异常处理
1.文件的定义和类型 什么是文件呢? 文件是数据的抽象和集合 文件是存储在辅助存储器上的数据序列 文件是存储的一种 文件有哪些类型呢? 本质上所有文件以二进制储存,不过又可以分为文本文件和二进制文件 ...
- Python学习六:面向对象编程(上)
文章目录 前言 一.面向对象编程: 1. oop [object oriented programming] 是一种python的编程思路 2. 解释 3. 面向对象 和面向对象编程 二.类和对象 1 ...
- Python知识点8——文件与异常
读文件 1.一次读取全部文件 def readfile1(filename):with open(filename) as fileobject:contents=fileobject.read()p ...
- python基础(文件、异常、模块、类、对象)
文件: 打开文件使用open函数,open()的第一个参数是:要打开文件的路径,如果只传入文件名那么将在当前文件下查找文件并打开.第二个参数是:文件的打开模式,其他参数都是默认的.文件的打开模式如下图 ...
- Python基础:文件和异常
写入文件 要将文本写入文件,你在调用open()时需要提供两个实参: 第一个实参是文件的名称,可以是相对路径(Python基于当前执行的.py文件所在的目录),也可以是绝对路径(不用多说),在Linu ...
最新文章
- numpy append
- C++类的基本概念演示Win32版
- html页面光标坐标值,javascript-在包含HTML内容的contentEditable区域中获取插入符(光标)的位置...
- 中断/gic代码导读:在哪里配置安全中断的?
- Navicat Error 2003 - can't connect to mysql server 'localhost' (10061)
- Python附带了大量的库 - 初学者如何学起
- 求众数leetcode(169)+投票算法
- nginx启动vue_nginx下部署vue项目的方法步骤
- JPSE问题诊断指导四——hprof
- TapTap 发布开发者服务:降低开发者研运成本 聚焦创作优质内容
- android华为隐藏底部虚拟按键,沉浸式状态栏/华为虚拟按键隐藏
- AutoCAD 样条曲线如何结束
- seewo一键投屏在mac电脑上的使用方法
- Google VP8 Code 首次深入技术分析 1
- 搜索:搜索+优先队列
- GD32上FAL Flash分区驱动移植及Easyflash与FlashDB移植说明
- 那些有意思的网站(1)
- bogomips 骁龙820_中兴这款骁龙820手机堪称经典,如今跌幅近千元
- cd linux自带系统安装,Windows 7+CDLinux+Ubuntu 10.04全硬盘安装
- ios android 一键换机,App Store 上的“手机搬家 - 一键换机助手”