前言
本章中我们将学习处理文件,处理大量无数据,我们将学习错误处理,避免程序因错误而奔溃,我们将学习异常,我们将学习模块json
学习处理文件和保存数据可以让你的程序使用起来更容易
学习处理异常可以帮助你应对文件中不存在的情形,以及处理可能导致程序崩溃的问题
一、文件与异常
从文件中读取数据
在处理文件时,从文件中读取数据时最基本的任务。将文件中的信息读取到内存中,我们可以一次性读取文件中的所有内容,也可以每一行逐步读取。
读取整个文件
with open(‘python.txt’) as file_object:
contents=file_object.read()
关键字with在不需要访问文件的时候将文件关闭,open()函数是打开文件并返回一个表示文件的对象。关键字as就是前面学的给文件另命名。
read()函数读取该文件中的全部内容,并将其作为一个长长的字符串储存在content中,read()函数在到达文件末尾时返回一个空字符串,这个空字符串显示出来就是一个空行,可以用rstrip()函数删去末尾的空行。
文件路径
在查找文件时,有两种确定文件位置的方法,一种是相对路径法,另一种是绝对路径法。
相对路径:就是指被打开的文件相对于该文件的相对位置,注意在文件的路径中使用反斜杠\而不是斜杠/。
绝对路径:就是指被打开的文件在电脑中的位置,一般从C、D盘开始。
逐行读取
要以每次一行的方式读取文件,可以使用for语句。
用for语句时,会发现换行符变多了,这是因为文件本身就有一个换行符,而print函数中也会自动生成一个换行符。
同样可以使用rstrip函数来消去。
创建一个包含各行内容的列表
使用关键字with时,想要调用文件的内容,只能在with结构内部使用。可以使用函数readlines(),readlines()从文件中读取每一行,并将其储存在一个列表中。之后再用for语句遍历即可。
使用文件的内容
在读取到文件中的内容后,只需要将该内容赋值给变量,我们就可以使用该文件的内容了,不过要注意文件中换行时的空格问题。
生日是否包含在字符串中
使用in语句即可。
2.写入文件
要将文本写入文件,调用open函数需要提供两个参数,第一个是文件的名称,第二个是“w”,告诉python我们将要往文档中写入内容,注意,若是文档中原先就有内容,python会将内容清空。
默认情况下,第二个参数是‘r’为读取模式,
还有一种情况为‘a’,是附加模式,python不会把原先的内容清空。
写入文件的操作为write()函数,write函数不会像print函数那样,在结尾自动换行,所以文件中要是有换行的需要,需要手动换行
3.异常
在python中若是程序出现了错误,会返回一个traceback信息,这个信息对于程序员解决问题很有必要,但是却会让用户感到费解,所以我们不需要将traceback信息呈现给用户,反而应该用一种给通俗的表达。
使用try-except代码块
将可能发生错误的代码块放在try之后,将代码块发生错误的反应放在except之后,当代码块发生错误时,将运行except后的代码。
使用try except代码块会使程序更加容错,当程序发生错误时,程序不会崩溃,反而是发出一条友好的信息。
else代码块
在try-except 中还应该包括一个代码块运行成功之后的结果,这个结果应该放在else中。
处理ZeroDivisionError和FileNoFoundError
除0错误很简单,只要在除0之前加入try-except-else代码块即可
文件未找到错误,也可以用try-except-else代码块解决。
失败时一声不吭
可以用pass语句,它提醒你程序的某个地方什么都没干,并且以后将要干什么。
4.存储数据
程序将用户的信心存放到列表或者字典中时,我们需要保存这种数据,一种简单的方式时json来存储数据。
使用json.dump()和json.load()
json.dump是用来存储数据的,json.load是用来将这些数据读取到内存中。
json.dump接受两个参数,一个是存储数据的对象,一个是将要存储到其中的文件的名称。通常使用文件扩展名.json来表明文件储存的数据为JSON格式。
json.load()将数据读取到内存中。它接受.json格式的文件。
保存和读取用户生成的数据
有了以上的两个函数,我们就能够很轻松的对用户数据进行保存了。
我们可以用json.dump()来创建一个关于用户数据的json格式的文件,从而实现保存用户数据。
用json.load()来读取已有的用户信息。
重构
代码能能够正常的运行,但是将可做进一步的改进——将代码划分为一些列完成具体工作的函数,这样的过程成为重构。
二、代码
1.
代码如下:
#学习笔记
file_name='Python_notebook.txt'
"""
with open(file_name,'w') as file_object:
file_object.write('In Python you can learn some knowledge of list\n')
file_object.write('In Python you can learn some knowledge of dictionary\n')
file_object.write('In Python you can learn lots of knowledge\n')
with open(file_name) as file_object:
x=file_object.read()
print(x.rstrip())
with open(file_name) as file_object:
for line in file_object:
print(line.rstrip())
with open(file_name) as file_object:
lines=file_object.readlines()
note=''
for line in lines:
note+=line
print(note)
"""
#C语言学习笔记
with open(file_name) as file_object:
lines=file_object.read()
while True:
x=lines.replace('Python',"C")
if 'Python' not in x:
break
file_name=file_name.replace('Python','C')
with open(file_name,'w') as file_object:
file_object.write(x)
with open(file_name) as file_object:
print(file_object.read().rstrip())
#多个访客
while True:
guest=input("input 'q' to exit,so what's your name: ")
if guest=='q':
break
else:
with open('guest.txt','a') as file_object:
file_object.write(guest+'\n')
print('hi! '+guest)
#关于程序的调查
while True:
reason=input("input 'q' to exit,so what's the reason why you like programming: ")
if reason=='q':
break
else:
with open('reason.txt','a') as file_object:
file_object.write(reason+'\n')
print('I know,'+reason)
#加法运算,类型错误
while True:
try:
y=int(input('请输入第一个数字'))
x=int(input('请输入第二个数字'))
z=x+y
except ValueError:
print('请输入正确的数字类型')
else:
print(z)
#沉默的猫和狗
file_name=input('请输入文档名称,带后缀')
try:
with open(file_name) as file_object:
x=file_object.read().rstrip()
print(x)
except FileNotFoundError:
#print('文件不存在')
pass
#喜欢的数字
import json
file_name='favorite_number.json'
"""
with open(file_name,'w') as file_object:
json.dump(input('请输入你最喜欢的数字'),file_object)
with open(file_name) as file_object:
numbers=json.load(file_object)
with open(file_name) as file_object:
x=file_object.read().rstrip()
print('your favourite number is '+x)
"""
#记住喜欢的数字
try:
with open(file_name) as file_object:
x=file_object.read().rstrip()
except FileNotFoundError:
with open(file_name,'w') as file_object:
json.dump(input('请输入你最喜欢的数字'),file_object)
with open(file_name) as file_object:
numbers=json.load(file_object)
print('your favourite number is '+numbers)
else:
print('I have remembered your favorite number,that is '+x)
#验证用户
def get_stored_username():
filename='username.json'
try:
with open(filename) as f_obj:
username=json.load(f_obj)
except FileNotFoundError:
return None
else:
return username
def 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 username
def greet_user():
username=get_stored_username()
if username:
x=input('Is '+username+' your name?(yes/no)')
if x.lower()=='yes':
print('welcome back! '+username)
elif x.lower()=='no':
username=get_new_username()
print("I'll remember you, "+username)
else:
username=get_new_username()
print("I'll remember you, "+username)
greet_user()
总结
本章学习了文件、异常与存储数据。