10.1 从文件中读取数据
10.1.1 读取整个文件
1.open()函数:
①要以任何方式使用文件,都要先打开文件,才能访问
②open()函数接受一个参数,即要打开的文件的名称
③函数open()返回一个表示文件的对象
2.关键字with
①关键字with在不再需要访问文件后将其关闭
3.方法read()
①使用read()方法读取这个文件的全部内容
②read()到达文件末尾时返回一个空字符串,将这个空字符串显示出来时就是一个空行,删除多出来的空行,可调用rstrip()函数
with open('pi.txt') as file_object:
contents = file_object.read()
print(contents)
10.1.2 文件路径
1.相对路径
①打开与python程序文件在同一目录的文件
②文件路径相对于当前运行的程序所在目录的
2.绝对路径
①指出希望python到哪里去查找,给出完整的路径,这样就不用关心当前运行的程序存储在什么地方了
②绝对路径要比相对路径要长
③使用绝对路径,可读取系统中任何地方的文件
3.文件路径写法
①在代码中显示文件路径时,要使用斜杠/,而不是反斜杠
②如果一定要使用反斜杠,可对路径中的每个反斜杠都进行转义
C:\\path\\to\\file.txt
10.1.3 逐行读取
1.要以每次一行的方式检查文件,可对文件对象使用for循环
filename = 'pi.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
10.1.4 创建一个包含文件各行内容的列表
1.使用关键字with时,open()返回的文件对象只在with代码块内可用,要访问with代码块外的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表
①readlines()方法从文件中读取每一行,并将其存储在一个列表中
filename = 'pi.txt'
with open(filename) as file_object:
lines = file_object.readlines()
#在with代码块外使用
for line in lines:
print(line.rstrip())
10.1.5 使用文件的内容
filename = 'pi.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string= ''
for line in lines:
pi_string += line.rstrip()
print(pi_string )
print(len(pi_string))
notice:读取文本文件时,python将其中的所有文本都解读为字符串,如果读取的是数,并要将其作为数值使用,就必须使用函数int()将其转换为整数或使用函数float()将其转换为浮点数
10.2 写入文件
10.2.1 写入空文件
1.open()函数提供了两个实参,第一个是打开文件的名称,第二个是以什么模式打开这个文件
2.模式分为:写入模式(‘w’)、读取模式(‘r’)、附加模式(‘a’)、读写模式(‘r+’)
3.如果省略了模式实参,将以默认的只读模式打开
4.如果要写入的文件不存在,函数open()将自动创建它
①要注意的是,如果指定的文件已经存在,python将在返回文件对象前清空该文件的内容
②write()将一个字符串写入文件,不会在写入的文本末尾添加换行符
notice:python只能将字符串写入文本文件,要将数值数据存储在文件文件中,必须先使用函数str()将其转换为字符串格式
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love you")
10.2.3 附加文件
1.给文件添加内容,而不是覆盖原有的内容,以附加模式打开文件,且不会清空文件的内容
filename = 'programming.txt'
with open(filename, 'a') as file_object:
file_object.write("I love you, mom")
10.3 异常
10.3.1 使用try-except代码块
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero")
10.3.2 try-except-else代码块
1.使用try-except-else原理:python尝试执行try代码块中的代码,只有可能引发异常的代码才需要放到try语句中,执行成功时运行的代码放在else代码块中,运行try引发指定的异常该怎么办放在except中
10.3.3 静默失败
1.希望程序在发送异常时保持沉默,当作什么都没发送继续运行
2.使用pass语句,可用于让python在代码块中什么都不做,充当占位符
def count_word(filename):
"""计算一个文件大致包含多少个单词"""
try:
--snip--
expect FileNotFoundError:
pass
else:
--snip--
filenames = ['a', 'b', 'c']
for filename in filenames:
count_word(filename)
10.4 存储数据
1.模块json能够将简单的python数据结构转储到文件中,并在程序运行时加载该文件中的数据
10.4.1 使用json.dump()和json.load()
1.json.dump()接受两个实参:要存储的数据,以及可用于存储数据的文件对象
import json
numbers = [2, 3, 4, 5]
#指出将该数字列表存储在哪个文件中
filename = 'numbers.json'
with open(filename, 'w') as f:
#将数字列表存储在文件numbers.json中
json.dump(numbers, f)
2.json.load():加载存储在文件中的信息
import json
filename = 'numbers.json'
with open(filename) as f:
numbers = json.load(f)
print(numbers)
10.4.3 重构
1.目的:编写出清晰而易于维护和扩展的代码
import json
def greet_user():
"""问候用户,并指出其名字"""
filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
except FileNotFoundError:
username = input("What's your name?")
with open(fielname, 'w') as f:
jsom.dump(username, f)
print(f"We'll remember you when you come back, {username}")
else:
print(f"Welcome back, {username}")
greet_user()
对以上代码进行重构,通过对以上代码进行分析:
可重构为:存储用户就获取、没有存储就提示用户输入用户名、问候用户
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's your name?")
with open(fielname, 'w') as f:
jsom.dump(username, f)
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()