文件和异常

文件和异常

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 重构

  • 代码能够正确地运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数,这样的过程叫做重构

  • 重构能让代码更清晰、更易于理解、更容易扩展

  • 可以将重复性功能的代码放到函数中

posted @ 2021-12-09 09:41  写代码的小灰  阅读(70)  评论(0)    收藏  举报