本章内容来自书籍,记录下来仅方便复习,如有侵权,请联系作者删除。
+++python学习笔记+++
一、从文件中读取数据
读取一个文本文件的内容,重新设置这些数据的格式,并将其写入文件,让浏览器能够显示这些内容。
1. 读取整个文件
file_path = "D:/.../.../test.txt"
with open(file_path) as file_object:
contens = file_object.read()
print(contens)
(1)分析with open(file_path) as file_object:
如下:
- 函数open(),接受一个参数(文件的路径),返回一个表示文件的对象,Python将这个对象存储在"as"指定的变量中。
- 关键字with,在不需要访问文件后将其关闭。
我们也可以调用open()和close()来打开和关闭文件,但是这样做,如果程序存在bug,文件将不会关闭,可能会造成数据丢失。使用with关键字,Python自会在合适的时候自动将其关闭。
(2)方法read(),读取文件对象的内容,并返回到指定变量中。
2. 文件路径
文件路径,在Linux和OS X系统中,使用斜杠(/
),在windows系统中,使用反斜杠(\
)
- 绝对路径,将文件在计算机中的准确位置告诉Python
- 相对路径,文件的位置在python_work中,可以使用相对路径,否则使用绝对路径。
3. 逐行读取
用循环,遍历file_object
with open(file_path) as file_object:
for line in file_object:
print(line)
4. 创建一个包含文件各行内容的列表
使用with关键字时,函数open()返回的文件对象,只在with代码块内可用。如果要在代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中。
with open(file_path) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
分析lines = file_object.readlines()
如下:
- 方法readlines()从文件中读取每一行,并将其存储在一个列表中;
- 该列表可存储到指定变量(lines)中;
- 在with代码块之外,我们依然可用使用这个变量(lines)。
5. 使用文件的内容
将文件读取到内存中后,就可以以任何方式使用这些数据了。
file_path = "pi_30_digits.txt"
with open(file_path) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
运行结果:
3.141592653589793238462643383279
32
读取文本文件时,Python将其中所有文本都解读为字符串。如果你要转换为数值,可用函数int()将其转换为整数,或使用float()将其转换为浮点数。
6. 包含一百万位的大型文件
file_name = 'pi_million_digits.txt'
with open(file_name) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line
print(pi_string[:52])
print(len(pi_string))
7. 圆周率值中包含你的生日吗
birthday = input("Please enter your birthday: ")
if birthday in pi_string:
print("yes")
二、写入文件
1. 写入空文件
在调用open()时需要提供另一个实参,告诉Python你要写入打开的文件。
file_name = 'programming.txt'
with open(file_name,'w') as file_object:
file_object.write("I love programming.")
函数open()中,我们提供了两个实参,第一个实参是要打开的文件名称,第二个实参打开文件的模式,如果省略了模式实参,Python默认以只读模式打开文件。
-
第一个实参:
如果读取的文件不存在,会报错;
如果写入的文件不存在,函数open()将自动创建。 -
第二个实参:
读取模式(r
),只读
写入模式(w
),覆盖写入
附加模式(a
),追加写入
能够读取和写入(r+
)
调用方法: read(),readlines(),write()
方法write(),需要在括号中传入实参,提供需要写进文件中文本内容。
Python只能将字符串写入文本文件,要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。
2. 写入多行
调用方法write(),传入的形参中,包含换行符"\n
"
file_object.write("I love progranming.\n")
file_object.write("I love creating new games.\n")
3. 附件到文件
附加模式,是追加写入。
with open(file_name,'a') as file_object:
file_object.write("I love python\n")
三、异常
异常是使用try-except代码块处理的。
1. 处理ZeroDividionError异常
数字除以0时报错。
2. 使用try-except代码块
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero.")
运行结果:
You can't divide by zero.
3. 使用异常避免崩溃
尽量避免程序崩溃。否则可能会被攻击。
4. else代码块
try语句:可能发生异常的代码
except语句:try代码中引发指定的异常时,处理情况。
else语句:try代码块成功执行时,才需要运行的代码
try:
answer = 5/0
except ZeroDivisionError:
print("You can't divide by zero.")
else:
print(answer)
5. 处理FileNotFoundError异常
try:
with open('test.txt') as file_object:
lines = file_object.readlines()
except FileNotFoundError:
print("Sorry, the file test.txt is not found")
找不到文件时,引发FileNotFoundError异常。
这个错误是由函数open()导致的,因此要处理这个错误,必须将try语句放在open()代码行之前。
6. 分析文本
使用方法split()
方法split()以空格为分隔符将字符串拆分成很多个部分,并将这些部分都存储到一个列表中。
contents = f_object.read()
words = contents.split()
num_words = len(words)
print("num_words"+str(num_words))
7. 使用多个文件
将上式写成一个方法,用传入file_name.
def count_words(filename):
--snip--
filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:
count_words(filename)
要获取FileNotFoundError,避免traceback报错。
8. 失败时一声不吭
在except语句中使用pass
try:
--snip--
except FileNotFoundError:
pass
else:
--snip--
9. 决定报告哪些错误
根据需求,决定是否将捕获到的错误抛出,让用户知道。
四、存储数据
JAON(JavaScript Object Notation) 格式最初是为JavaScript开发的,当随后成了一种常见格式,被众多语言采用。
1. 使用json.dump()和json.load()
- json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
- json.load()接受一个实参,加载存储在指定文件中的信息。
import json
filename1 = 'number1.json'
filename2 = 'number2.json'
with open(filename1) as file_object:
numbers = json.load(file_object)
# print(numbers)
# numbers = [2,3,4,5,6,7]
with open(filename2,'w') as file_object:
json.dump(numbers,file_object)
2. 保存和读取用户生成的数据
import json
filename = 'username.json'
try:
with open(filename) as file_object:
user_name = json.load(file_object)
except FileNotFoundError as msg:
user_name = input("Please enter your name: ")
with open(filename,'w') as file_object:
json.dump(user_name,file_object)
print("Hello, "+user_name)
else:
print("Hello, " + user_name + "! ")
try代码块尝试读取指定文件中的数据,如果文件不存在,except代码块将新建该文件并保存数据。
3. 重构
将代码块封装在方法中,一个方法实现一个功能。
read_stored_username(),读取文件数据
save_stored_username(),将数据写入文件
greet_user(),打印数据
import json
filename = 'username.json'
def read_stored_username():
"""如果文件存在,获取用户名"""
try:
with open(filename) as file_object:
user_name = json.load(file_object)
except FileNotFoundError:
return None
else:
return user_name
def save_stored_username():
user_name = input("Please enter your name: ")
with open(filename,'w') as file_object:
json.dump(user_name,file_object)
return user_name
def greet_user():
user_name = read_stored_username()
if user_name:
print("Hello, " + user_name + "! ")
else:
user_name = save_stored_username()
print("Nice to meet you! " + user_name)
greet_user()
五、小结
学习了使用文件,一次性读取文件,写入文件,处理异常,存储Python数据结构,重构。