目录
10.3.1 处理 ZeroDivisionError 异常
10.3.5 处理 FileNotFoundError 异常
10.4.1 使用 json.dump() 和 json.load()
10.1 从文件中读取数据
需要分析或修改存储在文件中的信息时,读取文件很有用,对数据分析应用程序来说尤其重要。
例如,编写程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示这些内容。
要使用文本文件中的信息,首先需要将信息读取到内存中。
10.1.1 读取整个文件
创建一个 pi_digits.txt 文件,准确到后 30 位的圆周率值,且在小数点后每 10 位处换行:
3.1415926535
8979323846
2643383279
读取这个文件程序:
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
① 函数 open() 要打开文件,接收一个参数:要打开的文件的名称。Python 在当前执行的文件所在的目录中查找指定的文件。
② 关键字 with 在不需要访问文件后将其关闭。也可以调用 open() 和 close() 来打开和关闭文件,但这样做时,如果程序存在 bug 导致方法 close() 未执行,文件将不会关闭。
③ 方法 read() 读取这个文件的全部内容,并将其作为一个长长的字符串赋给变量 contents 。
④ 相比原文件,该输出不同的是末尾多了一个空行。因为 read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来就是一个空行。要删除多出来的空行可在函数调用 print() 中使用 rstrip() :
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
10.1.2 文件路径
当文件不再程序文件所属目录中,如果将文件存在 text_file 中,可以使用相对文件路径来打开其中的文件:
with open('text_file/pi_digits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
注意:显示文件路径时,Windows 系统使用反斜杠( \ )而不是斜杠( / ),但是在代码中依然可以使用斜杠。
还可以将文件在计算机中的准确位置告诉 Python ,称为绝对文件路径。
file_path = 'D:/python_work/file-10/text_file/pi_digits.txt'
with open(file_path) as file_object:
contents = file_object.read()
print(contents.rstrip())
通过绝对路径,可读取系统中任何地方的文件。如果一定要用反斜杠,可对路径中的每个反斜杠都进行转义,如 'D:\\python_work\\file-10\\text_file\\pi_digits.txt' 。
10.1.3 逐行读取
读取文件时,检查其中的每一行:可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。
要以每次一行的方式检查文件,可对文件对象使用 for 循环:
file_path = 'text_file/pi_digits.txt'
with open(file_path) as file_object:
for line in file_object:
print(line)
10.1.4 创建一个包含文件各行内容的列表
使用关键字 with 时,open() 返回的文件对象只在 with 代码块内可用。如果要在 with 代码块外访问文件的内容,可在 with 代码块内将文件的各行存储在一个列表中,并在 with 代码块外使用这个列表:
file_path = 'text_file/pi_digits.txt'
with open(file_path) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
方法 readlines() 从文件中读取一行,并将其存储在一个列表中。
10.1.5 使用文件的内容
将文件读取到内存中后,就能以任何方式使用这些数据了。
首先创建一个字符串,它包含文件中存储的所有数字,且没有任何空格:
file_path = 'text_file/pi_digits.txt'
with open(file_path) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string +=line.rstrip()
print(pi_string)
print(len(pi_string))
可使用 strip() 来删除原来位于每行左边的空格:
file_path = 'text_file/pi_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))
注意:读取文本文件时,Python 将其中的所有文本都解读为字符串。如果读取的是数,并要将其作为数值使用,就必须使用函数 int() 将其转换为整数或使用函数 float() 将其转换为浮点数。
10.1.6 包含一百万位的大型文件
当文本文件中包含精确到 1 000 000 位而不是 30 位的圆周率值,也可以创建这个包含所有这些数字的字符串。输出小数点后 50 位:
file_path = 'text_file/pi_million_digits.txt'
with open(file_path) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string +=line.strip()
print(f"{pi_string[:52]}...")
print(len(pi_string))