文件和异常
文件和异常
1、文件
1.1 从文件中读取数据
使用文本文件中的数据,可以直接将整个文本文件读取出来,也可以逐行读取
1.1.1 读取整个文件
with open('content.txt') as file :
contents = file.read()
print(contents.rstrip())
- 要以任何方式打开文件,哪怕只是打印其中的内容,都得先打开文件,然后才能访问它,所以一开始需要使用open()函数。
- 关键字with在不再需要访问文件后将其关闭
- 虽然close()函数可以关闭文件,但是
如果程序存在bug执行不到close()函数的话,文件就无法关闭,使用with关键字就可以只管打开文件,并在需要时使用它,Python自己会在合适的时候将文件关闭 - Read()方法可以读取文件的内容
- 打印的时候会发现有空行,因为read()方法
到达文件末尾时返回一个空字符串,而这个空字符串显示出来的就是空行,要删除空行需要使用rstrip()
1.1.2 文件路径
-
可以使用
相对路径和绝对路径,相对路径就是所要访问的文件和程序文件在同一个目录下,绝对路径就是访问的文件和程序文件不在同一个目录下,需要提供完整的路径# 如果文件存储在与程序同一个目录下,使用相对文件路径来查找 with open('text_files/filename.txt') as file_object : # 还可以将文件在计算机中的具体位置告诉python,这称为绝对路径 file_path = '/home/......' with open(file_path) as file_object
1.1.3 逐行读取
-
需要逐行读取文件中的内容,可使用
for循环来实现filename = 'content.txt' """filename不是文件名,而是让Python到哪里查找文件的字符串,如果是绝对路径,需要提供完整的路径""" with open(filename) as file_object: for line in file_object: print(line.rstrip())
1.1.4 创建一个包含文件各行内容的列表
filename = 'content.txt'
with open(filename) as file_object:
lines = file_object.readlines()#读取每一行内容
for line in lines :
print(line.rstrip())
- Readlines()方法从文件中读取每一行,然后将每一行的内容存储在一个列表中
1.1.5 使用文件内容
filename = 'content.txt'
with open(filename) as file_object :
lines = file_object.readlines()
string = ''
for line in lines :
string += line.rstrip()
print(string)
print(len(string))
# 读取文本文件中,python将其中的所有文本都解读为字符串。如果是读取的数字,并且要作为数值使用,需要使用int()或者float()转换成整数或者浮点数
1.2 写入文件
- 保存数据最简单的方式之一就是将数据写入文件当中
1.2.1 写入空文件
- 要将文本写入文件中,在调用open()时需要提供另一个参数,告诉Python要写入打开的文件
# 写入空文件 open()提供了两个实参,第一个实参是打开文件的名称,第二个实参'w'(写入模式),'r'(读取模式),'a'(附加模式),'r+'(读取和写入模式)
# 如果写入的文件不存在,python会先创建这个文件,如果文件存在,写入时会先清空这个文件
# python只能将字符串写入文件,要想讲数值存储到文本文件中,必须先使用函数str()将其转换成字符串格式
filename = 'content.txt'
with open(filename,'w') as file_object :
file_object.write("i love china")
1.2.2 写入多行
filename = 'content.txt'
with open(filename,'w') as file_object :
file_object.write("i love china \n")
file_object.write("i love taizhou")
1.2.3 附加到文件
# 要给文件添加内容,而不是覆盖原有的内容,可以附加模式打开文件,不会清空文件,将内容写入到文件的末尾
filename = 'content.txt'
with open(filename,'a') as file_object :
file_object.write("\n i love china \n")
file_object.write("i love taizhou")
2、异常
- 每当发生让python不知所措的错误时,它都会创建一个异常对象。如果编写了处理该异常的代码,程序将继续运行;如果没有编写处理该异常的代码,程序将停止,并显示一个traceback,其中包含有关异常的报告
2.1 处理ZeroDivisionError异常
print(5/0)
Traceback (most recent call last):
File "···simple_test.py", line 921, in <module>
print(5/0)
ZeroDivisionError: division by zero
- 可以看到0作为被除数后就出现了ZeroDivisionError,Python将停止运行上述的程序,并显示了一个Traceback
2.2 使用try-except代码块
-
当你认为可能发生了错误,可编写一个try-except代码块来处理可能引发的异常。让python尝试运行一些代码,并告诉它如果这些代码引发了指定的异常,该怎么办。
try: print(5/0) except ZeroDivisionError : print("You can't divide by zero !") # 如果try代码块中的代码运行没有问题,python将跳过except代码块;如果try代码块中的代码导致了错误,python将查找这样的except代码块,并运行其中的代码
2.3 使用异常避免崩溃
- 发生错误时,如果程序还有工作没有完成,妥善处理错误就尤为重要,尤其是在需要用户输入的程序当中,如果程序能够妥善处理用户的无效输入,就能够提示用户提供有效的输入,从而不会导致程序崩溃。
2.4 else代码块
# 依赖于try代码块成功执行的代码都应该放在else代码块中
print("输入两个数字相除\n")
print("提出按'q'\n")
while True :
first_name = input("第一个数:\n")
if first_name == 'q':
break
second_name = input("第二个数:\n")
try:
answer = int(first_name)/int(second_name)
except ZeroDivisionError:
print("0不可以被除\n")
else:
print(answer)
2.5 处理FilieNotFoundError异常
filename = 'robot.txt'
try :
with open(filename) as file_object :
contents = file_object.read()
except FileNotFoundError :
print(f"Sorry,the file {filename} does not exist.")
2.6 分析文本
-
split()以空格为分隔符将字符串拆成多个部分,并将这些部分存储到一个列表里面
-
.read() 每次读取整个文件,它通常将读取到底文件内容放到一个字符串变量中,也就是说 .read() 生成文件内容是一个字符串类型。 .readline()每只读取文件的一行,通常也是读取到的一行内容放到一个字符串变量中,返回str类型。 .readlines()每次按行读取整个文件内容,将读取到的内容放到一个列表中,返回list类型。
filename = 'You Have Only One Life.txt'
#计算文件中的词语数量
try :
with open(filename) as file_object :
contents = file_object.read()
except FileNotFoundError :
print("文件" + filename + " 不存在!")
else :
words = contents.split()
words_num = len(words)
print(f"{filename}文件中共有{words_num}个词")
2.7 使用多个文件
- 可以将计算文件中的词语数量定义为一个函数,要计算多个文件词语数量时多次调用即可
2.8 静默失败
- 在except语句中使用pass语句,让Python在发生错误时什么都不要做
3、存储数据
- 使用json来存储数据,将简单的python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据
3.1 使用json.dump()和json.load()
- json.dump()接受两个实参:存储的数据和可用于存储数据的文件对象
import json
numebers = [1,2,3,4,5]
filename = 'number.json'
with open(filename,'w') as file_object :
json.dump(numebers,file_object)
- json.load()将列表读取到内存中
import json
filename = 'number.json'
with open(filename) as file_object:
numbers = json.load(file_object)
print(numbers)
3.2 重构
-
代码能够正确地运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数,这样的过程叫做重构
-
重构能让代码更清晰、更易于理解、更容易扩展
-
可以将重复性功能的代码放到函数中

浙公网安备 33010602011771号