使用文件时,一种常见的问题是找不到文件:查找的文件可能在其他地方、文件名可能不正确、或者这个文件根本就不存在。
对于这些问题,都可以使用try-except代码块以直观的方式处理。
例:我们尝试读取一个不存在的文件。
filename = 'alice.txt'
with open(filename,encoding='utf-8') as f:
contents = f.read()
我们看一下这个程序,相比于之前的文件打开方式,这里面有两个不同之处:
一是使用变量f来表示文件对象,这是一种常见的做法。
二是给参数encoding指定了值,在系统的默认编码与要读取文件使用的编码不一致时,必须这样做。
运行结果:
python无法读取不存在的文件,因此引发了异常。
报错信息的最后一行代码报告了FileNotFoundError异常,这是python找不到要打开的文件时创建的异常。
在本例中,这个错误是函数open()导致的。因此要处理这个错误,必须将try语句放在包含open()的代码行之前:
filename = 'alice.txt'
try:
with open(filename,encoding='utf-8') as f:
contents = f.read()
except FileNotFoundError:
print(f"Sorry,the file {filename} does not exist.")
方法split()能根据一个字符串创建一个单词列表。
例:对童话名“Alice in wonderland”的字符串调用方法split()
title = "Alice in wonderland"
print(title.split())
运行结果:
方法split()以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。
例:确定本文有多少个单词
filename = 'alice.txt'
try:
with open(filename,encoding='utf-8') as f:
contents = f.read()
except FileNotFoundError:
print(f"Sorry,the file {filename} does not exist.")
else:
#计算该文件大致包含多少个单词
words = contents.split()
num_words = len(words)
print(f"The file {filename} has about {num_words} words.")
我们如果将上例程序中的大部分代码移到一个函数中,就可以利用循环对多本书进行分析。
def count_words(filename):
"""计算一个文件大致包含多少单词"""
try:
with open(filename, encoding='utf-8') as f:
contents = f.read()
except FileNotFoundError:
print(f"Sorry,the file {filename} does not exist.")
else:
words = contents.split()
num_words = len(words)
print(f"The file {filename} has about {num_words} words.")
filename = 'alice.txt'
count_words(filename)
分析多个文件:
def count_words(filename):
"""计算一个文件大致包含多少单词"""
try:
with open(filename, encoding='utf-8') as f:
contents = f.read()
except FileNotFoundError:
print(f"Sorry,the file {filename} does not exist.")
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)
如果分析的某个文件不存在,将丝毫不影响该程序处理其它文件。
在程序中,并非每次捕获到异常都需要告诉用户,有时候我们希望程序发生异常时保持沉默,就像什么都没发生一样。
让程序静默失败,可想通常那样编写try代码块,但在except代码块中使用pass语句,可以让python在代码块中什么都不要做。
def count_words(filename):
"""计算一个文件大致包含多少单词"""
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语句还充当了占位符