第十章 文件和异常
一、读取整个文件
1.函数open()接受一个参数:要打开的文件名。
2.关键字with在不在需要访问文件后将其关闭。
3.方法read() 读取文件的全部内容。
例:
with open('pi_dights.txt') as file_object:
contents = file_object.read()
print(contents)
二、文件的路径
1.相对路径
在Linux和OS X中,你可以这样编码:
with open('test_files/ filename.txt') as file_object:
在Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/):
with open('test_files\ filename.txt') as file_object:
2.绝对路径
在Linux和OS X中,你可以这样编码:
file_path = '/home/ehmatthers/other_files/test_files/ filename.txt'
with open(file_path) as file_object:
在Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/):
file_path = 'C:\Users\ehmatthers\other_files\test_files\ filename.txt'
with open(file_path) as file_object:
注意:由于反斜杠在Python中被视为转移标记,为在Windows中确保万无一失,应以原始字符串的方式指定路径,即在开头的单引号前加上r。
三、创建一个包含文件各行内容的列表
1.readlines()从文件中读取每一行,并经其存储在一个列表中。
例:
filename = 'pi_dights.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
四、使用文件中的内容
1.在存储变量的字符串中,包含原来位于每行左边的空格,为删除这些空格,可使用strip() 而不是rstrip()。
2.读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转换为浮点数。
五、写入空文件
1.调用open()时提供两个实参。第一个实参是要打开的文件名称;第二个实参('w')告诉Python,我们要以写入模式打开文件。
2.打开文件时,可指定读取模式('r')、写入模式('w')、附加模式('a')或让你能够读取和写入的模式('r+')。
3.如果你要写入的文件不存在,函数open()将自动创建它。
4.如果指定的文件存在,Python将在返回文件对象前清空文件。
5.Python只能将字符串写入文件,要将数值存储在文本文件中,必须使用函数str()将其转换为字符串格式。
例:
filename = 'programming.txt'
with open(filename) as file_object:
file_object.write('I love programming')
OUT:
I love programming
六、附加到文件
1.你以附模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都添加到文件的末尾。
2.如果指定的文件不存在,Python将为你创建一个空文件。
七、异常
1.Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。
八、使用try-expect 代码块
1.处理ZeroDivisionError异常的try-except代码块:
try:
print(5/0)
except ZeroDivisionError:
print('You can't divide by zero!')
九、else代码块
1.依赖于try代码块成功执行的代码都应放到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 zero!')
else:
print('answer')
OUT:
Give me two numbers,and I'll divide them
Enter 'q' to quit
First number: 5
Second number: 0
You can't divide by zero!
First number: 5
Second number: 3
answer
First number: q
十、处理FileNotFoundError 异常
fileanme = 'alice.text'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = 'Sorry,the file ' + filename + 'does not exit.'
print(msg)
十一、分析文本
1.使用split(),根据一个字符串创建一个单词列表。
例:
title = 'Alice in Worldland'
title.split()
OUT:
['Alice', 'in', 'Worldland']
十二、失败时一声不吭
1.Python有一个pass语句,可在代码中使用它来让Python什么都不做。
十三、存储数据
1.模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。
十四、使用json.dump()和 json.load()
1.函数json.dump()接收两个实参:要存储的数据以及可用于存储数据的文件对象。
例:
import json
numbers = [2,3,5,7,11,13]
filename = 'numbers.json'
with open(filename,'w') as f_obj:
json.dump(numbers,f_obj)
OUT: numbers.json
[2, 3, 5, 7, 11, 13]
2.使用函数json.load()加载存储在numbers.json中的信息,并将其存储到变量nunbers中。
例:
import json
filename = 'numbers.json'
with open(filename) as f_obj:
number = json.load(f_obj)
print(number)
OUT:
[2, 3, 5, 7, 11, 13]
十五、保存和读取用户生成的数据
import json
filename = 'username.json'
try:
with open(filename) as f_obj:
useranme = json.load(f_obj)
except FileNotFoundError:
username = input('What is your name?')
with open(filename, 'w') as f_obj:
json.dump(username,f_obj)
print('We\'ll remember you when you come back,' + username + '!')
else:
print('Welcome back, ' + username + '!')
十六、重构
1.重构:将代码分为一系列完成具体工作的函数的过程。
例:
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\'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:
print('Welcome back, ' + username + '!')
else:
username = get_new_username()
print('We\'ll remember you when you come back,' + username + '!')
greet_user()