目录
一、从文件中读取数据
1.1 读取整个文件
1.2 文件路径
1.3 逐行读取
1.4 创建一个包含文件各行内容的列表
1.5 使用文件的内容
1.6 包含一百万位的大型文件
1.7 圆周率中包含你的生日吗
二、写入文件
2.1 写入空文件
2.2 写入多行
2.3 附加到文件
练习
三、异常
3.1 处理ZeroDivisionError异常
3.2 使用异常避免崩溃
3.3 处理FileNotFoundError异常
3.4 分析文本
3.5 使用多个文件
3.6 pass()语句
四、 存储数据
4.1 使用json.dump()和json.load()
4.2 保存和读取用户生成的数据
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
print(contents.rstrip())
MAC OS使用“/”,windows 使用“\”。
读取文件时,常常需要检查其中的每一行:可能要在文件中查找特定的信息,或者以某种方式修改文件中的文本。
要以每次一行的方式检查文件,可对文件对象使用for循环:
filename = 'txt_file/pi_digist.txt'
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
使用关键字with时,open()返回的文件对象只在with代码块内可用,要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表。
filename = 'txt_file/pi_digist.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
e.g 以简单的方式使用圆周率的值。
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
!!读取文本时,Python将其中的所有文本都解读为字符串,若读到的是数字并要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用float()将其转换为浮点数。
对于可处理的数据量,Python没有任何限制,只要系统的内存足够做,想处理多少数据都可以。
filename = 'pi_million_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string +=line.strip()
print(pi_string[:52] + '...')
print(len(pi_string))
e.g 判断某人的生日是否包含在圆周率值的前10000001位中。(可将生日表示位一个?️数字组成的字符串,再检查这个字符串是否包含在pi_string中。
filename = 'pi_million_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip()
birthday = input("Enter your birthday, in the form mmddyy:")
if birthday in pi_string:
print("Your birthday appears in the first million digits of pi!")
else:
print("Your birthday does not appear in the first million digits of pi.")
练习:
e.g-1 在文本编辑器中新建一个文件,命名为“learning_python.py”;编写一个程序,读取该文件,并打印其内容。
filename = 'learning_python.txt'
with open(filename) as file_object:
# 读取整个文件
contents = file_object.read()
print(contents.rstrip())
# 遍历文件对象
for line in file_object:
print(line.strip())
# 将各行存储在一个列表中
lines = file_object.readlines()
# 在with代码块外打印文件内容
for line in lines:
print(line.strip())
e.g-2 使用方法replace()将字符串中的特定单词都替换为另一个单词。
message = "I really like dogs, I hace a dog named 'Pipi'."
print(message.replace('dog','cat'))
保存数据最简单的方式之一是将其写入文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在。
filename = 'programming.txt'
with open(filename,'w') as file_object:
file_object.write("I love programming!")
函数write()不会在写入文本末尾的换行符,需要指定换行符。\n——换行符,\t——制表符
with open(filename,'w') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
若要给文件添加内容,而不是覆盖原有的内容,可以使用附加模式打开文件;以附加模式打开文件时,Python不会在返回文件对象前清空文件,写入的内容将加在文件的末尾;若打开的指定文件不存在,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 browser.\n")
e.g 编写一个while循环,提示用户输入其名字。用户输入其名字后,在屏幕上打印一句问候语,并将一条访问记录添加到文件guest_book.txt中,确保每条记录都独占一行。
filename = 'guest_book.txt'
flag = True
with open(filename,'w') as file_object:
while flag:
name = input("Please input your name: ")
if name!='q':
message = "Hello, " + name.title()
print(message)
file_object.write(message + "\n")
else:
break
Python使用被称为异常的特殊对象来管理程序执行期间发生的错误,每当发生让Python无法处理的错误时,它会创建一个异常对象;若编写了处理该异常的代码,程序将继续运行,若未对异常进行处理,程序将停止,并显示traceback,其中包含有关异常的报告。
异常是使用try-except代码块处理的,try-except代码块让python执行指定的操作,同时告诉Python发生异常时该怎么办。使用try-except代码块时,即便出现异常程序也会继续运行,显示编写好的错误信息而不是traceback。
当认为可能发生了错误时,可编写一个try-except代码块来处理可能引发的异常。
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
发生错误时,若程序还没有完成工作,妥善得处理错误异常重要。这种情况常常出现在要求用户提供输入的程序中,如果程序能够妥善地处理无效输入,就能再提示用户有效输入,而不至于崩溃。
e.g 创建一个只执行除法运算的简单计算器。
print("Give me two number 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: ")
if second_number =='q':
break
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
try-except-else代码块的工作原理:
e.g 尝试读取一个不存在的文件。
filename = 'programming.txt'
try:
with open(filename) as file_object:
contents = file_object.read()
print(contents)
except FileNotFoundError:
msg = "Sorry, the file '" + filename + "' does not exist."
print(msg)
split():以空格为分割符将字符串拆分成多个部分,并将这些部分都存储在一个列表中,结果是一个包含字符串中所有单词的列表。
e.g 分析文本中包含多少单词。
try:
with open(filename) as file_object:
contents = file_object.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.")
def count_words(filename):
"""计算一个文件大致包含多少个单词"""
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.")
filenames = ['alice.txt','siddhartha.txt','moby_dick.txt','little_women.txt']
for filename in filenames:
count_words(filename)
pass语句可以跳过,也可以做占位符,提醒用户在程序的某个地方什么都没做,并且以后也许要在这里做些什么。
模块json能将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。还可以使用json在Python之间分享数据。Json数据并非Python专用。
json.dump()接受两个实参:要存储的数据、可用于存储数据的文件对象。
import json
numbers = [2,3,5,7,11,13]
filename = 'number.json'
with open(filename,'w') as f_obj:
json.dump(numbers,f_obj)
使用json.load()将数据读取到内存中。
import json
filename = 'number.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)
print(numbers)
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 +"!")