一、读文件
pi_digits.txt内容如下:
- 使用关键字with在不再需要访问文件后将其关闭,让Python负责妥善地打开和关闭文件。
- read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。
- 要删除多出来的空行,可在print 语句中使用rstrip()
1,读取文件
运行如下代码:
print("--------------- 读取文件-------------------")
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
print('rstrip:', contents.rstrip())
输出如下:
第一个print输出了Line One和一个空行,第二个print使用了rstrip(),没有输出空行。
2,逐行读取
- 根据上文,每行的末尾都有一个看不见的换行符,而print 语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print 语句。
print("--------------- 逐行读取-------------------")
with open('pi_digits.txt') as file_object:
for line in file_object:
print(line)
输出如下:
Line One和abc中间有三个换行符:
第一行:Line One 的末尾都有一个换行符,print有一个换行符
第二行:末尾有一个换行符,print有一个换行符
3,逐行读取,存储在列表
- readlines() 从文件中读取每一行,并将其存储在一个列表中
print("--------------- 使用文件的内容-------------------")
with open('pi_digits.txt') as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))
输出如下:
二、写入文件
- ('r')读模式,必须先打开文件。
- ('r+' )读写模式,需要先打开一个已有的文件。
- ('w' )写模式,打开文件,如果指定的文件已经存在,Python将在返回文件对象前清空该文件。
- ('w+' )写读模式,同'w',但可以读。
- ('a')追加模式,打开时
不
清空原文档,光标自动定位到文档末尾,只写,不可读。 - ('a+')追加写读模式,由于光标在末尾,此时进行读取的内容为空,需要移动光标位置。
- 如果你要写入的文件不存在,函数open() 将自动创建它。
print("--------------- 写入文件-------------------")
with open('programming.txt', 'w') as file_object:
file_object.write('i love programming.\n')
file_object.write('l love creating new games.\n')
文件内容如下:
追加写入:
# 要给文件添加内容,而不是覆盖原有的内容,可以附加模式 打开文件
with open('programming.txt', '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')
文件内容如下:
三、异常处理
语法:try...except...else...,在try中处理事务,except中抛出异常,让程序继续运行。
1、处理 ZeroDivisionError 异常
两数相除,除数不能为0,运行以下代码:
print("--------------- 异常处理-------------------")
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)
运行如下:
当除数为0,输出You can't divide by 0!,否则输出商。
2,处理 FileNotFoundError 异常
filename = 'aaa.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
else:
# 计算文件大致包含多少个单词
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) + " words.")
输出如下:
换成pi_digits.txt:
3,异常时什么都不做:pass
可在代码块中使用pass 语句来让Python 什么都不要做。
分别输出pi_digits.txt、aaa.txt和programming.txt有几个单词,文件不存在直接跳过:
import json
def count_words(filename):
"""计算文件单词数目"""
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
pass
else:
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) +
" words.")
filenames = ['pi_digits.txt', 'aaa.txt', 'programming.txt']
for filename in filenames:
count_words(filename)
输出如下:
四、应用
读取username.json,如果有,则读取用户名,否则,让用户输入用户名并保存,下次免登录。
import json
def greet_user():
"""问候用户"""
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 + "!")
greet_user()
运行如下: