《Python编程:从入门到实践》笔记 第 10 章 文件和异常

第 10 章 文件和异常

10.1 从文件中读取数据

10.1.1 读取整个文件

with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents) with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents) 

==>> 可将with open() as 看作固定结构

先来看看函数open() 。 要以任何方式使用文件——哪怕仅仅是打印其内容, 都得先打开 文件, 这样才能访问它。 函数open()接受一个参数: 要打开的文件的名称。

关键字with 在不再需要访问文件后将其关闭。 在这个程序中, 注意到我们调用了open() , 但没有调用close() ; 你也可以调用open() 和close() 来打开和关闭文件, 但
这样做时, 如果程序存在bug, 导致close() 语句未执行, 文件将不会关闭。 这看似微不足道, 但未妥善地关闭文件可能会导致数据丢失或受损。 如果在程序中过早地调
用close() , 你会发现需要使用文件时它已关闭 (无法访问) , 这会导致更多的错误。 并非在任何情况下都能轻松确定关闭文件的恰当时机, 但通过使用前面所示的结构, 可
让Python去确定: 你只管打开文件, 并在需要时使用它, Python自会在合适的时候自动将其关闭。

我们使用方法read() (前述程序的第2行) 读取这个文件的全部内容, 并将其作为一个长长的字符串存储在变量contents 中。 这样, 通过
打印contents 的值, 就可将这个文本文件的全部内容显示出来:

read() 到达文件末尾时返回一个空字符串, 而将这个空字符串显示出来时就是一
个空行。 要删除多出来的空行, 可在print 语句中使用rstrip()

10.1.2 文件路径

相对文件路径

相对文件路径让Python到指定的位置去查找, 而该位置是相对于当前运行的程
序所在目录的。

with open('text_files\filename.txt') as file_object:
绝对文件路径

绝对路径通常比相对路径更长, 因此将其存储在一个变量中, 再将该变量传递给open() 会有所帮助

file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt'
with open(file_path) as file_object:

Windows系统有时能够正确地解读文件路径中的斜杠。 如果你使用的是Windows系统, 且结果不符合预期, 请确保在文件路径中使用的是反斜杠

10.1.3 逐行读取

❶ filename = 'pi_digits.txt'with open(filename) as file_object:for line in file_object:
print(line)

为何会出现这些空白行呢? 因为在这个文件中, 每行的末尾都有一个看不见的换行符, 而print 语句也会加上一个换行符, 因此每行末尾都有两个换行符: 一个来自文件, 另一
个来自print 语句。 要消除这些多余的空白行, 可在print 语句中使用rstrip()

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

使用关键字with 时, open() 返回的文件对象只在with 代码块内可用。 如果要在with 代码块外访问文件的内容, 可在with 代码块内将文件的各行存储在一个列表中, 并
在with 代码块外使用该列表: 你可以立即处理文件的各个部分, 也可推迟到程序后面再处理。

filename = 'pi_digits.txt'
with open(filename) as file_object:
❶ lines = file_object.readlines()for line in lines:
print(line.rstrip())

在with 代码块中将文件pi_digits.txt的各行存储在一个列表中, 再在with 代码块外打印它们

打印 π \pi π 的前50位(string)

print(pi_string[:52] + "...")

10.2 写入文件

10.2.1 写入空文件

要将文本写入文件, 你在调用open() 时需要提供另一个实参, 告诉Python你要写入打开的文件

filename = 'programming.txt'with open(filename, 'w') as file_object:
❷ file_object.write("I love programming.")

调用open() 时提供了两个实参(见❶) 。 第一个实参也是要打开的文件的名称; 第二个实参(‘w’ ) 告诉Python, 我们要以写入模式 打开这个文件。 打开文件
时, 可指定读取模式 (‘r’ ) 、 写入模式 (‘w’ ) 、 附加模式 (‘a’ ) 或让你能够读取和写入文件的模式(‘r+’ ) 。 如果你省略了模式实参, Python将以默认的只读模式
开文件。
如果你要写入的文件不存在, 函数open() 将自动创建它。 然而, 以写入(‘w’ ) 模式打开文件时千万要小心, 因为如果指定的文件已经存在, Python将在返回文件对象前清空该文件。

我们使用文件对象的方法write() 将一个字符串写入文件。

注意 Python只能将字符串写入文本文件。 要将数值数据存储到文本文件中, 必须先使用函数str() 将其转换为字符串格式。

10.2.2 写入多行

函数write() 不会在你写入的文本末尾添加换行符

10.2.3 附加到文件

如果你要给文件添加内容, 而不是覆盖原有的内容, 可以附加模式 打开文件。 你以附加模式打开文件时, Python不会在返回文件对象前清空文件, 而你写入到文件的行都将添加
到文件末尾。 如果指定的文件不存在, Python将为你创建一个空文件。

10.3 异常

我们可根据这些信息对程序进行修改。 下面我们将告诉Python, 发生这种错误时怎么办;

10.3.2 使用try-except 代码块

try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")

如果try-except 代码块后面还有其他代码, 程序将接着运行, 因为已经告诉了Python如何处理这种错误。

10.3.4 else 代码块

依赖于try 代码块成功执行的代码都应放到else 代码块中:

try:
answer = int(first_number) / int(second_number)except ZeroDivisionError:
print("You can't divide by 0!")else:
print(answer)

10.3.5 处理FileNotFoundError 异常

10.3.6 分析文本

方法split() 以空格为分隔符将字符串分拆成多个部分, 并将这些部分都存储到一个列表中。 结果是一个包含字符串中所有单词的列表, 虽然有些单词可能包含标点。

10.3.7 使用多个文件

封装成函数

10.3.8 失败时一声不吭

Python有一个pass 语句, 可在代码块中使用它来让ython什么都不要做

def count_words(filename):
"""计算一个文件大致包含多少个单词"""
try:
--snip--
except FileNotFoundError:pass
else:
--snip--
filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:

相比于前一个程序, 这个程序唯一不同的地方是❶处的pass 语句。 现在, 出现FileNotFoundError 异常时, 将执行except 代码块中的代码, 但什么都不会发生。 这种错误
发生时, 不会出现traceback, 也没有任何输出。 用户将看到存在的每个文件包含多少个单词, 但没有任何迹象表

10.4 存储数据

模块json 让你能够将简单的Python数据结构转储到文件中, 并在程序再次运行时加载该文件中的数据。 你还可以使用json 在Python程序之间分享数据。 更重要的是, JSON数据
格式并非Python专用的, 这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。 这是一种轻便格式, 很有用, 也易于学习。
注意 JSON(JavaScript Object Notation) 格式最初是为JavaScript开发的, 但随后成了一种常见格式, 被包括Python在内的众多语言采用。

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

函数json.dump() 接受两个实参: 要存储的数据以及可用于存储数据的文件对象。

import json
numbers = [2, 3, 5, 7, 11, 13]
❶ filename = 'numbers.json'with open(filename, 'w') as f_o

  1. 导入模块json
  2. 指定了要将该数字列表存储到其中的文件的名称通常使用文件扩展名.json来指出文件存储的数据为JSON格式
  3. 使用函数json.dump() 将数字列表存储到文件numbers.json中

下面再编写一个程序, 使用json.load() 将这个列表读取到内存中:

import json
❶ filename = 'numbers.json'with open(filename) as f_obj:
❸ numbers = json.load(f_obj)
print(numbers)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值