我是靠谱客的博主 拼搏便当,最近开发中收集的这篇文章主要介绍文件和异常,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

处理文件和保存数据

                                                                      作者:雷蕾

我们将学习异常,它们是python创建的特殊对象,用于管理程序运行时出现的错误;
还会学习模块json,它能够保存用户数据,以免再程序停止运行后丢失,学习处理文件和保存数据可以让我们的程序使用起来更容易。
(一)从文件中读取数据
(1)读取整个文件
要读取文件,我们先要创建一个文本文件,示例pi_digits.txt文件保存了小数点后30位的圆周率值:
3.1415926535
8979323846
2643383279
现在我们试着用代码去读取整个文件并将保存的内容打印在屏幕上:

with open('pi_digits.txt')as file_object:
    contents=file_object.read()
print(contents)

我们试着解读这段代码:
要以任何形式使用文件都得先打开文件才能运用它,第一行代码中函数open()接受一个参数:要打开的文件的名称(pi_digits.txt),Python在当前执行的程序文件所在的目录中查找指定的文件。
函数open()返回一个表示文件的对象,在示例中,open(‘pi_digits.txt’)返回一个表示文件pi_digits.txt的对象,python将该值赋给file_object供以后使用。
关键字with在不再需要访问文件后将其关闭。
有了表示pi_digits.txt的对象后,使用方法read()读取这个文件的全部内容,并将其作为一个长长的字符串赋值给contents。任何通过打印contens的值就可将这个文本文件的全部内容显示出来。
打印结果显示:

3.1415926535
 8979323846
 2643383279

 
>>> 

打印结果多了空行,我们可以使用方法rstrip()删除字符串末尾的空白。
我们把最后一行代码改为:

print(contents.rstrip())

打印结果:

3.1415926535
 8979323846
 2643383279
>>>

(2)文件路径
文件路径可分为相对文件路径和绝对文件路径,当要读取的文件和当前执行的程序文件在一个目录时我们可使用相对文件路径,绝对文件路径比相对文件路径要长,因为绝对文件路径是我们将要读取的文件在计算机中的准确位置告诉python,这样我们不用担心要读取的文件和当前执行的程序文件是否在一个目录中。
要使用绝对文件路径时,我们要注意的是在计算机中文件位置使用反斜杠(),而在python中我们要改为斜杠(/),不然会报错。
(3)逐行读取
当我们要遍历文本文件所保存的内容的每一行时,我们可使用for循环:

with open('pi_digits.txt')as file_object:
    for line in file_object:
        print(line.rstrip())

打印结果:

3.1415926535
 8979323846
 2643383279

(4)创建一个包含文件各行内容的列表
使用关键字with()时,Open()返回的文件对象只在with代码块内使用,我们要在with代码块外访问文件的内容,可在with代码块内将文件各行存储在一个列表中,并在with代码块外使用该列表。
我们来创建一个示例将with代码块中文件pi_digits.txt的各行存储在一个列表中,再在with代码块外打印:

filename='pi_digits.txt'
with open(filename)as file_object:
    lines=file_object.readlines()
    for line in lines:
        print(line.rstrip())

方法readlines()是从文件中读取每一行,并将其存储在一个列表中,之后将该列表赋给变量lines。
(5)使用文件中的内容
将文件读取到内存中后,我们可以以任何形式使用这些数据。

filename='pi_digits.txt'
with open(filename)as file_object:
    lines=file_object.readlines()
    pi_string=''
    for line in lines:
        pi_string+=line.strip()
    print(pi_string)
    print(len(pi_string))

和上一个示例不同,在这个示例中我们多了一个变量pi_string,我们使用for循环将存储在ines中的每一行加入到pi_string中,并用方法删除rstrip()删除每行末尾的换行符,最后打印并计算字符串长度。
打印结果:

3.141592653589793238462643383279
32
>>> 

(6)大型文件
当文本文件保存的数据很多时,我们如何只查询文件的一部分数据呢?
在新的文本文件pi_million_digits.txt中,我们保存了圆周率小数点后100位数,那我们如何只查询小数点后50位数呢?
pi_million_digits.tx:
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

filename='pi_million_digits.txt'
with open(filename) as file_object:
    lines=file_object.readlines()
    pi_string=''
    for line in lines:
        pi_string+=line.strip()
print(f"{pi_string[:52]}...")
print(len(pi_string))

代码行pi_string[:52]就是只打印到小数点后50位数。
打印结果:

3.14159265358979323846264338327950288419716939937510...
102

(二)写入文件
保存数据最简单的方式就是将数据写入文件中。
(1)写入空文件
要将文本写入文件,在调用函数open()时需要提供另一个实参,要写入打开的文件的名称。

filename='programming.txt'
with open(filename,'w') as file_object:
    file_object.write("i love programming")

不同于读取文件的示例,在这个示例中,函数open()包含两个实参,一个是文件名称,另一个是实参’w’,是我们要告诉python要以写入模式打开文件。
代码行file_object.write(“i love programming”)使用文件对象的方法write()将字符串"i love programming"写入文件,最终字符串会保存在programming.txt文件中。
(2)写入多行
我们可以在文件中写入多行字符串,由于函数write()不会在写入的文本末尾添加换行符,因此我们需要在指定换行时添加换行符n。

filename='programming_0.txt'
with open(filename,'w') as file_object:
    file_object.write("i love programming")
    file_object.write("i love creating new games.")
    file_object.write("ni love programming")
    file_object.write("ni love creating new games.n")

我们打开文件programming_0.txt看看:
i love programmingi love creating new games.
i love programming
i love creating new games.
(3)附加到文件
在读取模式中,有写入模式(‘w’)附加模式(‘a’)或读写模式(‘r+’)
那我们要给文件添加内容又不覆盖之前的内容,我们使用附加模式进行操作。

filename='programming_0.txt'
with open(filename,'a') as file_object:
    file_object.write("ni love creating appps that can run in a browser!")

我们再次打开文件programming_0.txt看看:
i love programmingi love creating new games.
i love programming
i love creating new games.

i love creating appps that can run in a browser!
(三)异常
编写处理异常的代码,程序会继续执行,如果未对异常进行处理,程序将停止并返回traceback,其中有关异常的报告。
(1)处理ZeroDivisionError异常
我们知道不能用数除以0,如果我们这样做了python会怎么样呢?

print(5/0)

运行结果(报错):

Traceback (most recent call last):
  File "C:Users12184Desktoppython_work10_文件和异常division_calculator.py", line 3, in <module>
    print(5/0)
ZeroDivisionError: division by zero
>>> 

那当我们认为可能会发生错误时,可编写一个 try-except代码块来处理可能发生的异常。

try:
    print(5/0)
except ZeroDivisionError:
    print('you can not divide by zero')

运行结果:

you can not divide by zero
>>>

将导致错误的代码行print(5/0)放在try代码块中,如果try代码块中的代码运行没有问题,python跳过except代码块,如果try代码块中的代码运行有问题导致了错误,python将查找与之匹配的except代码块并运行其中的代码。
在示例中,try代码块中的代码引发了ZeroDivisionError异常,因此python将查找与之匹配的except代码块并运行其中的代码,这样我们看到了一条友好的错误消息,而不是报错traceback。
(2)处理异常崩溃/else代码块

print("give me two numbers, and i will divide them.")
print("enter 'q' to quit!")
while True:
    first_number=input("nfirst_number:")
    if first_number=='q':
        break
    two_number=input("ntwo_number:")
    if two_number=='q':
        break
    try:
        answer=int(first_number)/int(two_number)
    except ZeroDivisionError:
        print("you can not divide by zero!")
    else:
        print(answer)

让python尝试执行try代码块中的除法运算,这个代码块只包含可能导致错误的代码,依赖try代码块成功执行的代码都放在else代码块中,示例中,如果除法运算成功,就使用else代码块来打印结果。
(四)存储数据
模块json(JavaScript Object Notation)让我们能够将简单的python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。
(1)使用json.dump()和json.load()
我们先来看一段示例:存储一组数的简短程序,再编写一个将这些数读取到内存中的程序。

import json
numbers=[2,3,5,7,11,13]
filename="number.json"
with open(filename,'w')as f:
    json.dump(numbers,f)

这个示例中,我们先导入模块json,然后又创建了一个数字列表numbers。
代码行filename="number.json"指定了要将数字列表存储到number.json文件中,文件扩展名.json表示文件存储的格式为JSON格式。
代码行with open(filename,‘w’)as f:以写入模式打开这个文件,让json能够将数据写入其中。
代码行 json.dump(numbers,f)是使用函数 json.dump()将数字列表存储到文件number.json中。
可以打开文件number.json查看所保存的内容:[2, 3, 5, 7, 11, 13]
我们还可以使用json.load()将列表读取到内存中:

import json
filename="number.json"
with open(filename)as f:
    numbers=json.load(f)
print(numbers)

代码行filename="number.json"是确保读取的是前面写入的文件
代码行with open(filename)as f:默认以读取方式打开文件
代码行 numbers=json.load(f)使用函数json.load()加载存储在number.json文件中的信息,并将信息赋给变量numbers,最后打印。
打印数据列表结果:

[2, 3, 5, 7, 11, 13]
>>>

(2)保存和读取用户生成的数据

import json
username=input("what is your name?")
filename="username.json"
with open(filename,'w')as f:
    json.dump(username,f)
    print(f"we will remember you when you come back,{username}!")

代码行username=input(“what is your name?”)提示用户输入用户名并将其赋给变量username。
代码行json.dump(username,f)是调用函数json.dump()并将用户名和一个文件对象传递给它,从而将用户名存储到文件中。
username.json文件保存内容:“Lee”
打印结果:

what is your name?Lee
we will remember you when you come back,Lee!

我们试着编写一个程序,看我们之前输入的用户名是否已保存成功,并向保存成功的用户名发出问候:

import json
filename="username.json"
with open(filename)as f:
    username=json.load(f)
print(f"welcome,{username}!")

打印结果:

welcome,Lee!
>>> 

我们将json.dump()和json.load()两个程序合并:

import json
#如果以前存储了用户名,就加载它
#否则,提示用户输入用户名并存储它
filename="username.json"
try:
    with open(filename)as f:
        username=json.load(f)
except FileNotFoundError:
    username=input("what is your name?")
    with open(filename,'w')as f:
        josn.dump(username,f)
        print(f"we will remember you when you come back,{username}!")
else:
    print(f"welcome,{username}!")

在这个示例中,我们尝试从文件username.json中获取用户名,如果用户名存在则打印,不存在的话就在except代码块中提示用户输入用户名并存储到文件username.json中,以便下次需要时能够获取,最后进行问候语的打印。
因为我们的文件sername.json在之前的示例中已经成功存储了用户名,因此能够在else代码块中打印出:

welcome,Lee!

最后

以上就是拼搏便当为你收集整理的文件和异常的全部内容,希望文章能够帮你解决文件和异常所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部