1. 从文件中读取数据
- 读取文本文件时,Python 将所有文本解读为字符串
- 若要将读取的数字作为数值使用,必须使用函数 int() 或 float() 将其转换为整数或浮点数
(1) 读取整个文件
# open() 返回一个表示文件的对象
# 关键字 with 在不再需要访问文件后将其关闭,也可以通过调用 close() 来关闭
# 文件可使用绝对或相对路径,Linux 或 OS X 中使用斜杠(/),而 Windows 中使用反斜杠(\)
# - with open('/home/text_files/pi_digits.txt') as file_object:
# - with open('text_files\pi_digits.txt') as file_object:
with open('pi_digits.txt') as file_object:
# read() 读取文件的全部内容,并返回相应的字符串
contents = file_object.read()
print(contents)
=>
# 比原始文件末尾多一个空行,是因为 read() 到达文件末尾时返回一个空字符串,可以在 print 语句中使用 rstrip() 将其去除
3.1415926535
8979323846
2643383279
(2) 逐行读取
filename = ‘pi_digits.txt’
with open(filename) as file_object:
for line in file_object:
print(line)
=>
# 文件每行末尾都有一个看不见的换行符,print 也会加上一个换行符,因此每行末尾都有两个换行符,所以出现了这些空白行
3.1415926535
8979323846
2643383279
(3) 创建一个包含文件各行内容的列表
filename = ‘pi_digits.txt’
with open(filename) as file_object:
# readlines() 从文件中读取每一行 ,并将其存储在一个列表中
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
2. 写入文件
(1) 写入空文件
filename = 'programming.txt'
# open() 的第二个参数指定打开模式
# - r:只读模式(默认)
# - w:写入模式
# - a:附加模式
# - r+:读取和写入模式
#
# 若要写入的文件不存在,open() 将自动创建它;若已存在,将在返回文件对象前清空该文件
with open(filename, 'w') as file_object:
# Python 只能将字符串写入文本文件,若要存储数值数据,须先使用 str() 将其转为字符串格式
# write() 不会自动在写入的文本末尾添加换行符,可以手动添加(还可以使用空格、制表符和空行来设置输出的格式)
file_object.write('I love programming.\n')
file_object.write('I love creating new games.\n')
=>
programming.txt 文件内容:
I love programming.
I love creating new games.
(2) 附加到文件
filename = 'programming.txt'
# 使用附加模式打开
# 若指定文件不存在,Python 将创建一个空文件
with open(filename, 'a') as file_object:
file_object.write('I also love finding meaning in large datasets.\n')
file_object.write('I love creating apps that can run in a browser.\n')
=>
programming.txt 文件内容:
I love programming.
I love creating new games.
# 在文件末尾添加内容,而不是覆盖
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.
3. 异常
异常是管理程序执行期间发生的错误的特殊对象
- 异常被处理,程序将继续运行(继续运行 try 之后的代码,try 代码块内剩余代码不会运行);否则停止,并显示一个Traceback
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("\nSecond number: ")
if second_number == 'q':
break
# 应该将只可能引发异常的代码放在 try 语句中
try:
answer = int(first_number) / int(second_number)
# 可根据 Traceback 获取异常类型,如除0异常的 Traceback 会提示“... ZeroDivisionError: division by zero”
# except 代码块中可以使用 pass 语句(只填写“pass”即可),将会在异常发生时没有任何输出,包括 Traceback
# - pass 还充当了占位符,提醒你在该位置什么都没有做,且以后也许要在这里做些什么
except ZeroDivisionError:
print("You can't division by 0!")
# else 代码块可以没有,即只使用 try-except
# 依赖于 try 代码块成功执行的代码都应放到 else 代码块中
else:
# 若置于 try 代码块中,效果一致
print(answer)
4. 存储数据
重构:将代码划分为一系列完成具体工作的函数的过程
# 需要先导入模块 json
import json
def get_stored_username():
"""如果存储了用户名,就获取它"""
# 使用扩展名为 .json 的文件
filename = 'username.json'
try:
# 以读取模式打开
with open(filename) as file_object:
# json.load() 方法将文件数据读取到内存中
username = json.load(file_object)
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 file_object:
# json.dump() 方法将数据存储到文件中
json.dump(username, file_object)
return username
def greet_user():
"""问候用户,并指出其名字"""
username = get_stored_username()
# if None: False
if username:
print("Welcome back, " + username + "!")
else:
username = get_new_username()
print("We'll remember you when you come back, " + username + "!")
greet_user()
=>
username.json 文件内容:
"Sally"
控制台输出:
- 首次运行:
What is your name?Sally
We'll remember you when you come back, Sally!
- 非首次运行:
Welcome back, Sally!