第十章 文件和异常

目录

10.1 从文件中读取数据

10.1.1 读取整个文件

10.1.2 文件路径

10.1.3 逐行读取

10.1.4 创建一个包含文件各行内容的列表

10.1.5 使用文件的内容

10.1.6 包含一百万位的大型文件

10.1.7 圆周率值中包含你的生日吗

10.2 写入文件

10.2.1 写入空文件

10.2.2 写入多行

10.2.3 附加到文件

10.2 异常

10.3.1 处理 ZeroDivisionError 异常

10.3.2 使用 try-except 代码块

10.3.3 使用异常避免崩溃

10.3.4 else 代码块

10.3.5 处理 FileNotFoundError 异常

10.3.6 分析文本

10.3.7 使用多个文件

10.3.8 静默失败

10.4 存储数据

10.4.1 使用 json.dump() 和 json.load() 

10.4.2 保存和读取用户生成的数据

10.4.3 重构


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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半边山的海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值