写入文件
要将文本写入文件,你在调用open()时需要提供两个实参:
第一个实参是文件的名称,可以是相对路径(Python基于当前执行的.py文件所在的目录),也可以是绝对路径(不用多说),在Linux或OS X中,文件路径类似于这样'text_files/filename.txt';在Windows系统中,使用反斜杠而不是斜杠'text_files\filename.txt',由于反斜杠在Python中被视为转义标记,为在Windows中确保万无一失,应以原始字符串的方式制定路径,即在开头的单引号前加上r。
第二个实参‘w’告诉Python,我们要以写入模式打开这个文件。打开文件时,可指定读取模式('r')、写入模式('w')、附加模式('a')或让你能够读取和写入文件的模式('r+')。如果你省略了模式实参,Python默认只读模式打开文件。
关键字with在不需访问文件后将其关闭,open()返回的文件对象只在with代码块内可用。这里只调用了open(),但没有调用close();你也可以调用open()和close()来打开和关闭文件。
Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用str()函数将其转换为字符串格式。
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
如果你想要给文件添加内容,而不是复制原有的内容,可以附加模式打开文件。如果指定的文件不存在,Python将为你创建一个空文件。
filename = 'programming.txt'
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 broswer.\n")
从文件中读取数据
使用read()方法读取文件的全部内容。readline()或readlines()方法进行更细致的处理。
filename = 'programming.txt'
def print_file_contents1():
''' using read()'''
with open(filename) as file_object:
contents = file_object.read()
print(contents.rstrip())
def print_file_contents2():
''' using for'''
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
def print_file_contents3():
''' using readlines()'''
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
print_file_contents1()
print_file_contents2()
print_file_contents3()
异常
Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。异常是使用try-except代码块或try-except-else代码块处理的。依赖于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 0!")
else:
print(answer)
有时候你希望程序在发生异常时一声不吭,就像什么都没有发生一样继续运行。Python中有一个
pass语句,可在except代码块明确的告诉Python什么都不要做。
存储数据
一种简单的方式是使用模块json来存储数据。JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用。
函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
函数json.load()加载存储在文件对象中的信息,并返回它。
import json
filename = 'username.json'
try:
with open(filename) as f_obj:
username = 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 + "!")
你经常会遇到这样的情况:代码能够正确的运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程被成为重构。重构让代码更清晰、更易于理解、更容易扩展。
import json
def get_stored_username():
'''if stored username, return it'''
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():
'''prompt imput username'''
username = input("What is your name?")
filename = 'username.json'
with open(filename, 'w') as f_obj:
json.dump(username,f_obj)
return username
def greet_user():
'''greet user, print username '''
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()