第十章:文件和异常
10.1 从文件中读取数据
10.1.1 读取整个文件
with open('文件名') as 变量1:
变量2 = 变量1.read()
print(变量2)
注:方法strip删除字符串前后的空格,lstrip删除字符串之前的空格,rstrip删除字符串之后的空格
10.1.2 文件路径
Windows系统有时能够正确地解读文件路径中的斜杠(/)。
如果未成功解读,将斜杠(/)换位反斜杠(\)即可。
另外,由于反斜杠在Python中被视为转义标记,为在Windows中确保万无一失,
应以原始字符串的方式指定路径,在开头的单引号前加上r。
10.1.3 逐行读取
变量1 = '文件路径'
with open(变量1)as 变量2:
for line in 变量2:
print(line.rstrip)
10.1.4 创建一个包含文件各行内容的列表
变量1 = '文件路径'
with open(变量1)as 变量2:
变量3 = 变量2.read.lines()
for line in 变量3:
print(line.rstrip())
方法readlines()从文件中读取每一行,并将其存储在一个列表中。
10.1.5 使用文件中的内容
读取文件中的信息之后,对信息进行循环遍历、运算等操作。
注意:读取文本文件时,Python将其中的所有文本都解读为字符串。
如果你读取的是数字,并要将其作为数值使用,就必须使用函数int()将其转换为整数,
或使用函数float()将其转换为浮点数。
10.1.6 包含一百万位的大型文件
在输出这类文件中的内容时,一般只需要前几十位数据,u送一我们要用到切片
print(f"{变量[:60]}...")
10.2 写入文件
10.2.1 写入空文件
filename = 'text_files/programming.txt'
with open(filename, 'a') as file_object:
file_object.write(" I Love You")
open()函数有两个实参:一个时要打开的文件的名称,另一个是告诉Python以什么形式打开文件
'w'、'r'、'a':写入模式、读取模式、附加模式
如果忽略了模式实参,Python将以默认的只读模式打开文件
如果你要写入的文件不存在,函数open()将自动创建它。
以写入模式('w')打开已存在文件,将在返回文件对象前清空该文件
注:Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换
为字符串格式
10.2.2 写入多行
函数write()不会在你写入的文本末尾添加换行符
10.2.3 附加到文件
文件原来的内容还在,它们后面是我们刚添加的内容
10.3 异常
10.3.1 处理ZeroDivisionError异常
运行下列代码会报错,程序停止运行
print(5/0)
Traceback (most recent call last):
File "test.py", line 1, in <module>
print(5/0)
ZeroDivisionError: division by zero
10.3.2 使用try-except代码块
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
10.3.3 使用异常避免崩溃
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: ")
if second_number == 'q':
break
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
except ValueError:
print("Please enter number!")
else:
print(answer)
Python尝试执行try代码块中的代码;
只有可能引发异常的代码才需要放在try语句中。
有时候,有一些仅在try代码块成功执行时才需要运行的代码;这些代码应放在else代码块中。
excpet代码块告诉苦python,如果它尝试运行try代码块中的代码时引发了指定的异常,该怎么办。
10.3.5 分析文本
方法split():根据一个字符串创建一个单词列表。
以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。
10.3.3 使用多个文件 + 失败时一声不吭
def count_words(filename):
"""Count the approximate number of words in a file."""
try:
with open(filename, encoding='utf-8') as f:
contents = f.read()
except FileNotFoundError:
pass
else:
words = contents.split()
num_words = len(words)
print(f"The file {filename} has about {num_words} words.")
filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:
count_words(filename)
pass语句:执行pass语句,python不会做任何操作,程序继续运行。用户看不到不需要了解的错误。
10.4 存储数据
JSON格式最初是为JavaScript开发的,但随后成了一种常见的格式,被包括python在内的众多语言采用。
10.4.1 使用json.dump()和json.load()
json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f:
json.dump(numbers, f)
json.load()接受一个实参:被读取的文件名
import json
filename = 'numbers.json'
with open(filename) as f:
numbers = json.load(f)
print(numbers)
10.4.2 保存和读取用户生成的数据
10.4.3 重构
重构:将代码划分为一系列完成具体工作的函数。
重构让代码更清晰、更易于理解、更容易拓展。
import json
def get_stored_username():
"""如果获取了用户名,就获取它"""
filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
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 g:
json.dump(username, g)
return username
def greet_user():
"""问候用户并指出其姓名"""
username = get_stored_username()
if username:
print(f"Welcome back, {username}!")
else:
username = get_new_username()
print(f"We'll remember you when you come back {username}!")
greet_user()