您的位置:首页 > 编程语言 > Python开发

Python第十章文件和异常笔记

2020-04-19 22:22 399 查看

10.1从文件中读取数据

10.1.1读取整个文件
文件pi_digits.txt存储精确到30位的圆周率

3.1415926535
8979323846
2643383279

(1)采用函数open()打开文件,返回一个表示文件的对象
(2)关键词with在不再需要访问文件时将其关闭
(3)有了表示文件的对象后,使用方法read()读取文件内容,并将其作为一个长长的字符串存储在变量contents中
注:末尾输出是多了一行,是因为read()到达文件末尾返回一个空字符串,显示出来就是空行,可在输出时用方法rstrip()删除

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

3.1415926535
8979323846
2643383279
>>>

10.1.2文件路径
(1)相对路径
让Python打开不与程序文件位于同一个目录中的文件, 需要提供文件路径 , 它让Python到系统的特定位置去查找,比如python_work文件夹有一个子文件text_files,而python_work所属的目录文件是找不到text_files的
在Linux和OSX中可以这样编写代码:
with open(‘text_files/filename.txt’) as file_object:
而在Windows中,在文件路径中使用反斜杠(\)而不是斜杠(/):
with open(‘text_files\filename.txt’) as file_object:
(2)绝对路径
若text_files不在python_work中,而在另一个文件夹other_files,则不能用相对路径,绝对路径通常比相对路径长,因此将其存储到一个变量当中,再将变量传递给open()
在Linux和OS X中, 绝对路径类似于下面这样:
file_path = ‘/home/ehmatthes/other_files/text_files/filename.txt’
with open(file_path) as file_object:
而在Windows中:
file_path = ‘C:\Users\ehmatthes\other_files\text_files\filename.txt’
with open(file_path) as file_object:
10.2.3逐行读取
(1)将要读取的文件名存储在变量中
(2)调用open
(3)for遍历文件每一行

filename = 'pi_digits.txt'

with open(filename) as file_object:
for line in file_object:
print(line)

打印结果空白行变多:
每行末尾两个换行符:在文件中每行末尾都有换行符,print语句也会加上一个换行符,可在print语句中使用rstrip()
10.1.4创建一个包含文件隔行内容的列表
用方法readlines()从文件读取每行后将其存在列表中,
lines = file_object.readlines()
列表存储到变量中,在with代码块外用for循环打印变量中的各行
10.1.5使用文件内容
打开文件将所有行存在列表中
创建变量(一个空字符串):pi_string = ’ ’
用for循环将各行加入变量

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

注:
Python将所有文本解读为字符串,若读取数字,并将其作为数值使用,必须使用int()将其转换为整数,或使用float()转换为浮点数
10.1.6包含一百万位的大型文件
10.1.7判断文件中是否有某个特定值

判断由特定值组成的字符串是否在列表中可以用if

10.2写入文件

10.2.1写入空文件
在调用open时提供两个实参,第一个是要打开的文件的名字,第二个是告诉Python要以什么样的模式打开这个文件,模式有:
读取模式:‘r’
写入模式:‘w’
附加模式:‘a’
读取和写入文件模式:‘r+’

filename = 'programming.txt'

with open(filename,'w') as file_object:
file_object.write("I am learning English")

若写入的文件不存在,函数open() 将自动创建它。但以写入(‘w’ ) 模式打开文件时要注意, 因为如果指定的文件已经存在, Python将在返回文件对象前清空该文件。
注意 Python只能将字符串写入文本文件。 要将数值数据存储到文本文件中, 必须先使用函数str() 将其转换为字符串格式
10.2.2写入多行
函数write不会在写入的文本末尾添加换行符,因此如果要写入多行,要指定换行符
10.2.3附加到文件
若要给文件添加内容(不覆盖原有内容),可以用附加模式打开文件
Python不会在返回文件对象前清空文件, 而你写入到文件的行都将添加到文件末尾。 如果指定的文件不存在, Python将为你创建一个空文件。

10.3异常

10.3.1处理ZeroDivisionError 异常

print(5/0)

运行时会出现异常

    print(5/0)ZeroDivisionError: division by zero

ZeroDivisionError是一个异常对象,这种情况下Python会停止运行,并指出引发了哪种异常
10.3.2使用try_except代码块
发生错误时可以编写一个try_except代码块来处理可能引发的异常

try:
print(5/0)except ZeroDivisionError:
print("You can't divide by zero!")

运行结果为:

You can't divide by zero!

如果try 代码块中的代码运行起来没有问题, Python将跳过except 代码块; 如果try 代码块中的代码导致了错误, Python将查找这样的except 代码块, 并运行其中的代码, 即其中指定的错误与引发的错误相同。在这个示例中, try 代码块中的代码引发了ZeroDivisionError 异常, 因此Python指出了该如何解决问题的except 代码块, 并运行其中的代码。
如果try-except 代码块后面还有其他代码, 程序将接着运行
10.3.3使用异常避免崩溃
创建一个只执行除法运算的简单计算器

print("Give me two numbers,and I'll divide them.")
print("Enter 'q' to quit.")

while True:
first_number = input("\nFirst number: ")
if first_number == 'q':
break
second_number = input("Second number: ")
if second_number == 'q':
break
answer = int(first_number) / int(second_number)
print(answer)

当输入的第二数为0时则出现崩溃
10.3.4 else代码块

print("Give me two numbers,and I'll divide them.")
print("Enter 'q' to quit.")

while True:
first_number = input("\nFirst number: ")
if first_number == 'q':
break
second_number = input("Second number: ")
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)

如果try 代码块因除零错误而失败, 我们就打印一条友好的消息, 告诉用户如何避免这种错误。程序将继续运行, 用户根本看不到traceback,而如果除法运算成功就是用else代码块打印结果
10.3.5处理FileNotFoundError异常
若要读取一个不存在的文件的内容,则会出现异常
try代码块放在open()的代码块之前
10.3.6分析文本
方法split()是根据一个字符串创建一个单词列表

>>> title = "Alice in Wonderland"
>>> title.split()
['Alice', 'in', 'Wonderland']

方法split() 以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中, 结果是一个包含字符串中所有单词的列表,虽然有些单词可能包含标点,接着可以用函数len确定多少个单词
10.3.7使用多个文件
可以先将程序的大部分代码移到一个名为count_words()函数中

def count_words(filename):
'''计算一个文件大致包含多少个单词'''
try:
with open(filename) as file_object:
contents = file_object.read()
except FileNotFoundError:
msg = "Sorry,the file " + filename + " does not exit."
print(msg)
else:
#计算文件单词数
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) +
" words.")

filename = 'guest.txt'
count_words(filename)

使用多个文件时可以将要分析的文件名称存储在一个列表中,循环调用
10.3.8 异常时不表示继续运行
pass语句

def count_words(filename):
'''计算一个文件大致包含多少个单词'''
try:
--snip--
except FileNotFoundError:
pass
else:
--snip--
filename = 'guest.txt'
count_words(filename)

pass 语句还充当了占位符, 它提醒你在程序的某个地方什么都没有做, 并且以后也许要在这里做些什么。 例如, 在这个程序中, 我们可能决定将找不到的文件的名称写入到文件missing_files.txt中。 用户看不到这个文件, 但我们可以读取这个文件, 进而处理所有文件找不到的问题。
10.3.9决定报告哪些错误
另:使用方法count() 来确定特定的单词或短语在字符串中出现了多少次

10.4存储数据

10.4.1使json.dump存储和json.load读取内存中的程序
1.函数json.dump需要两个形参,要存储的数据和可用于存储数据的文件对象

import json

numbers = [2,3,4,5,7,11]

filename = 'numbers.json'
with open(filename,'w') as file_object:
json.dump(numbers,file_object)

步骤:(1)导入模块
(2)指定要存储列表的文件名称,通常使用扩展名.json指出文件存储数据格式为JSON格式
(3)以写入模式打开文件,让json能够将数据写入其中
(4)使用函数json.dump()将列表存储到文件中
2.函数json.load()读取

import json

filename = 'numbers.json'
with open(filename) as file_object:
numbers = json.load(file_object)

print(numbers)

步骤 :(1)导入模块
(2)确保读取的是前面写入的文件
(3)以读取模式打开文件
(4)使用函数json.load()加载存储在文件中的信息,并将其存储在变量中
(5)打印
10.4.2保存和读取用户的数据
try-except-else
10.4.3重构
将代码划分为一系列完成具体工作的函数

import json
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 is 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:
print("Welcome back, " + username + "!")
else:
username = get_new_username()
print("We'll remember you when you come back, " + username + "!")

greet_user()
  • 点赞
  • 收藏
  • 分享
  • 文章举报
islabilabi 发布了12 篇原创文章 · 获赞 0 · 访问量 288 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: