文件和异常
(一)从文件中读取数据
- 要使用文本文件中的信息,首先需要将信息读取到内存中。为此,可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。
1、读取整个文件
- 要读取文件,需要一个包含几行文本的文件。
#创建一个文本文件
Hello World!
Hello everyone!
# 第一行代码中,函数open()负责接受一个参数:即要打开文件的名称。
# 之后返回一个表示文件的对象,即1.txt。并存储到变量中。
# 关键字with在不需要访问文件时将其关闭。也可以不使用with而使用close(),close语句执行后,文件会立即关闭。
# 因此建议使用with关键字防止数据不必要的损失。
# 方法read()读取文件全部内容,并将其作为字符串储存到变量hello。
# 注意,read方法到达文件末尾会自动返回一个空字符串,可以使用rstrip方法删除空行。
with open('1.txt', encoding='utf-8') as file:
hello = file.read()
print(hello.rstrip())
Hello world!
Hello everyone!
2、文件路径
- 直接将简单文件名作为参数传递给open函数时,python将在当前执行的文件所在目录中查找文件
- 要让python打开不与程序文件位于同一目录的文件,需要提供文件路径。
- 文件路径有相对文件路径与绝对文件路径,如果程序文件与文件夹位于同一目录,使用相对路径,如果不在,使用绝对路径
#相对文件路径只需指定文件名称即可
with open('file/1.txt', encoding='utf-8') as file:
hello = file.read()
print(hello.rstrip())
#绝对文件路径需要指定具体位置,注意使用绝对文件路径分隔符使用//,或者在文件路径前加上r
file_path='C://Users//阚开豪//Desktop//demo//hello.txt'
with open(file_path,encoding='utf-8') as demo:
hello =demo.read()
print(hello.rstrip())
Hello world!
Hello everyone!
Hello world!
Hello everyone!
3、逐行读取
- 要以每次一行的方式检查文件,可对文件对象使用for循环。
filename='file/1.txt'
with open(filename,encoding='utf-8') as lines:
for line in lines:
print(line.rstrip())
#Hello world!
#Hello everyone!
4、创建一个包含文件各行内容的列表
- 使用关键字with是,open返回的文件对象仅在with代码块内可以使用。若要在with代码外访问文件的内容,可以在with代码块内将文件的各行存储到一个列表中,并在with代码块外使用列表。
#创建一个文本文件
wangerxiao.
lisi.
zhangsan.
They are good friends!
filename='file/2.txt'
with open(filename,encoding='utf-8') as files:
#readlines方法从文件中读取每一行并将其存储到一个列表当中。注意若只读取第一行则使用readline方法。
lines=files.readlines()
#遍历列表
for line in lines:
print(line.rstrip())
#输出为
wangerxiao.
lisi.
zhangsan.
They are good friends!
5、使用文件的内容
- 将文件读取到内存中就可以以任何方式使用这些数据了。
#创建一个文本
wang
er
xiao
filename='file/3.txt'
with open(filename,encoding='utf-8') as files:
lines=files.readlines()
white=''
#创建一个空字符串用来储存line
for line in lines:
white+=line.rstrip()
print(white)
#输出为
#wangerxiao
- 注意:读取文本文件时,python将其中的所有文本都解读为字符串。当读取的位数字并要将其作为数值使用时,就必须使用函数int()将其转化为整数或者float()将其转化为浮点数。
6、读取文件的综合使用
#朋友姓名
wangerxiao.
lisi.
zhangsan.
wangwu.
bainan.
filename='file/2.txt'
with open(filename,encoding='utf-8') as files:
lines=files.readlines()
white=''
for line in lines:
white+=line
myfriend=input("Tell me your fried's name:")
if myfriend in white:
print("Your friend is intivited!")
else:
print("NO!")
Tell me your fried's name:wangerxiao
#检查输入的姓名是否存在
Your friend is intivited!
7、补充:方法replace的使用
- 方法replace可以将字符串当中的特定单词替换为另一个单词
#创建一个文本
wangerxiao like c.
zhangsan like python.
lisi like python.
They are all good boys!
filename='file/2.txt'
with open(filename,encoding='utf-8') as files:
lines=files.readlines()
for line in lines:
take=line.replace('python','c')
#将所有的python替换为c
print(take.rstrip())
#输出为
wangerxiao like c.
zhangsan like c.
lisi like c.
They are all good boys!
(二)写入文件
- 保存数据的最简单的方式之一就是把他们写入到文件中。
1、写入空文件
要将文本写入文件,在调用open()时需要提供另一个实参,告诉python需要写入打开的文件。
- 实参‘w’:写入模式
- 实参‘r’:读取模式
- 实参‘a’:附加模式
- 实参‘r+’:读取和写入文件的模式
#创建一个空文本文件
filename='file/4.txt'
with open(filename,'w',encoding='utf-8') as files:
files.write("zhaosi like java.")
#此时4.txt中将出现写入的文本
- 注意:python只能将字符串写入文本文件。要将数值数据存储到文本文件当中,必须先使用str()将其转换为字符串格式。
2、写入多行
- 函数write()不会在末尾添加换行符,要让每个字符串单独占一行,需要在write语句中包含换行符。
#创建一个空文本文件
filename='file/4.txt'
with open(filename,'w',encoding='utf-8') as files:
files.write("zhaosi like java.\n")
files.write("wangwu like c++.\n")
3、附加到文件
- 如果要给文件添加内容而不是覆盖原有的内容,可以使用附加模式打开文件。该模式下,写入的文件将添加到文件末尾,如果指定的文件不存在,python将会创建一个空文件。
filename='file/4.txt'
with open(filename,'a',encoding='utf-8') as file:
file.write("liujiu like c#.")
#源文件中将加入写入的语句
(三)异常
- python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让python无法识别的程序时,都会创建一个异常对象。
- 如果编写处理异常的代码,程序将继续运行,反之将出现一个traceback。(包含异常的报告)
- 异常是使用try—expect代码处理。try—expect代码块让python执行指定的操作并告诉python异常时如何处理。
1、使用try—expect代码块
#print(5/0)
#ZeroDivisionError异常出现
#加入try—expect代码块
try:
print(5/0)
except ZeroDivisionError:
print('NO!')
#输出NO!
2、使用异常避免程序崩溃
- 发生错误时,如果程序还有工作没有完成,妥善的处理错误就尤为重要。
#制作一个除法计算器并使用try—expect代码块防止出现ZeroDivisionError异常出现
print("Give me two numbers,and I will give a answer")
one=input("The first number is:")
two: str=input("The second number is:")
try:
answer=int(one)/int(two)
except ZeroDivisionError:
print("Try again!")
#依赖于try代码块成功执行的代码都应被放在else代码块中
else:
print(str(answer))
Give me two numbers,and I will give a answer
The first number is:2
The second number is:0
Try again!
3、处理FileNotFoundError异常
- 使用文件时一种常见的问题是找不到文件。错位是由于函数open()导致的,因此要处理这个错误,必须将try()语句放在包含open()的代码行之前。
#读取一个不存在的文件
filename='0.txt'
try:
with open(filename,encoding='utf-8') as file:
lines=file.read()
except FileNotFoundError:
print("Your computer can't found it!")
#输出为:Your computer can't found it!
4、分析文本
- 引进方法split(),它将根据一个字符串创建一个单词列表。
filename='file/1.txt'
try:
with open(filename ,encoding='utf-8') as file:
lines=file.read()
except FileNotFoundError:
print("Your computer can't found it!")
else:
words=lines.split()
num=len(words)
print("The file "+filename+" has "+str(num)+" words.")
#输出:The file file/1.txt has 17 words.
5、分析多个文件
- 将函数与循环结合使用
def count(filename):
try:
with open(filename ,encoding='utf-8') as file:
lines=file.read()
except FileNotFoundError:
print("Your computer can't found it!")
else:
words=lines.split()
num=len(words)
print("The file "+filename+" has "+str(num)+" words.")
filenames=['file/1.txt','file/2.txt','file/0.txt']
for file in filenames:
count(file)
#输出为:
The file file/1.txt has 17 words.
The file file/2.txt has 14 words.
Your computer can't found it!
6、pass使用
- python有一个pass语句,可在代码块中使用它来让python什么都不用做。
def count(filename):
try:
with open(filename ,encoding='utf-8') as file:
lines=file.read()
except FileNotFoundError:
pass
else:
words=lines.split()
num=len(words)
print("The file "+filename+" has "+str(num)+" words.")
filenames=['file/1.txt','file/2.txt','file/0.txt']
for file in filenames:
count(file)
The file file/1.txt has 17 words.
The file file/2.txt has 14 words.
#0.txt不存在但并未报错
(四)存储数据
- 使用模块json来存储数据。模块json让你能够简单的python数据结构存储到文件中,并在程序再次运行时加载该文件中的数据。
- 另外还可以使用json在python程序之间分享数据。
1、使用josn.dump()和json.load()
函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as file:
#使用函数json.dump()将数字列表存储到文件number.json中
json.dump(numbers, file)
import json
filename = 'numbers.json'
with open (filename) as file:
numbers=json.load(file)
print(numbers)
2、保存和读取用户生成的数据
- 对于用户生成的数据,使用数据json保存有许多好处,如果没有不以某种方式进行存储,等程序停止运行时用户的信息会丢失。
import json
username=input("What is your name?\n")
filename='username.json'
with open (filename,'w',encoding='utf-8') as file:
json.dump(username,file)
print("Your name is "+username+'!')
#输出为:
What is your name?
hanmeimei
Your name is hanmeimei!
import json
filename='username.json'
with open(filename,encoding='utf-8') as file:
username=json.load(file)
print("I love you,"+username+"!")
#输出为:I love you,hanmeimei!
#将两段程序合并
import json
filename='username.json'
try:
with open(filename,encoding='utf-8') as file:
username=json.load(file)
except FileNotFoundError:
username=input("What is your name?\n")
with open(filename,'w') as line:
json.dump(username,line)
print("We'll remember you when you come back, "+username+"!")
else:
print("Welcome back, "+username+"!")
#首次运行
What is your name?
yangtianxin
We'll remember you when you come back, yangtianxin!
#至少运行一次以后
Welcome back, yangtianxin!
3、重构
- 将代码划分为一系列完成具体的工作函数,这样的过程称为重构。
import json
#将源代码重构为三部分独立的函数
#如果存储了用户名就获取它
def stored():
filename='username.json'
try:
with open (filename,encoding='utf=8') as file1:
username=json.load(file1)
except FileNotFoundError:
return None
else:
return username
#提示用户输入用户名
def get():
username=input("What's your name?")
filename='username.json'
with open (filename,'w',encoding='utf-8') as file2:
json.dump(username,file2)
return username
#提示用户输入用户名
def greet():
username=stored()
if username:
print("Welcom back, "+username+" !")
else:
username=get()
print("We'll remember you when you come back, "+username+" !")
greet()
300





