返回介绍

8.2 文件读写过程

发布于 2024-01-22 21:44:06 字数 3895 浏览 0 评论 0 收藏 0

在熟悉了处理文件夹和相对路径后,你就可以指定文件的位置,进行读写。接下来几节介绍的函数适用于纯文本文件。“纯文本文件”只包含基本文本字符,不包含字体、大小和颜色信息。带有.txt扩展名的文本文件,以及带有.py扩展名的Python脚本文件,都是纯文本文件的例子。它们可以被Windows的Notepad或OS X的TextEdit应用打开。你的程序可以轻易地读取纯文本文件的内容,将它们作为普通的字符串值。

“二进制文件”是所有其他文件类型,诸如字处理文档、PDF、图像、电子表格和可执行程序。如果用Notepad或TextEdit打开一个二进制文件,它看起来就像乱码,如图8-5所示。

图8-5 在Notepad中打开Windows的calc.exe程序

既然每种不同类型的二进制文件,都必须用它自己的方式来处理,本书就不会探讨直接读写二进制文件。好在,许多模块让二进制文件的处理变得更容易。在本章稍后,你将探索其中一个模块:shelve。

在Python中,读写文件有3个步骤:

1.调用open()函数,返回一个File对象。

2.调用File对象的read()或write()方法。

3.调用File对象的close()方法,关闭该文件。

8.2.1 用open()函数打开文件

要用open()函数打开一个文件,就要向它传递一个字符串路径,表明希望打开的文件。这既可以是绝对路径,也可以是相对路径。open()函数返回一个File对象。

尝试一下,先用Notepad或TextEdit创建一个文本文件,名为hello.txt。输入Hello world!作为该文本文件的内容,将它保存在你的用户文件夹中。然后,如果使用Windows,在交互式环境中输入以下代码:

>>> helloFile = open('C:\\Users\\_your_home_folder_\\hello.txt')

如果使用OS X,在交互式环境中输入以下代码:

>>> helloFile = open('/Users/_your_home_folder_/hello.txt')

请确保用你自己的计算机用户名取代your_home_folder。例如,我的用户名是asweigart,所以我在windows下输入'C:\Users\asweigart\hello.txt'。

这些命令都将以读取纯文本文件的模式打开文件,或简称为“读模式”。当文件以读模式打开时,Python只让你从文件中读取数据,你不能以任何方式写入或修改它。在Python中打开文件时,读模式是默认的模式。但如果你不希望依赖于Python的默认值,也可以明确指明该模式,向open()传入字符串'r',作为第二个参数。所以open('/Users/asweigart/hello.txt', 'r')和open('/Users/asweigart/hello.txt')做的事情一样。

调用open()将返回一个File对象。File对象代表计算机中的一个文件,它只是Python中另一种类型的值,就像你已熟悉的列表和字典。在前面的例子中,你将File对象保存在helloFile变量中。现在,当你需要读取或写入该文件,就可以调用helloFile变量中的File对象的方法。

8.2.2 读取文件内容

既然有了一个File对象,就可以开始从它读取内容。如果你希望将整个文件的内容读取为一个字符串值,就使用File对象的read()方法。让我们继续使用保存在helloFile中的hello.txt File对象。在交互式环境中输入以下代码:

>>> helloContent = helloFile.read()
>>> helloContent
'Hello world!'

如果你将文件的内容看成是单个大字符串,read()方法就返回保存在该文件中的这个字符串。

或者,可以使用readlines()方法,从该文件取得一个字符串的列表。列表中的每个字符串就是文本中的每一行。例如,在hello.txt文件相同的目录下,创建一个名为sonnet29.txt的文件,并在其中写入以下文本:

When, in disgrace with fortune and men's eyes,
I all alone beweep my outcast state,
And trouble deaf heaven with my bootless cries,
And look upon myself and curse my fate,

确保用换行分开这4行。然后在交互式环境中输入以下代码:

>>> sonnetFile = open('sonnet29.txt')
>>> sonnetFile.readlines()
[When, in disgrace with fortune and men's eyes,\n', ' I all alone beweep my
outcast state,\n', And trouble deaf heaven with my bootless cries,\n', And
look upon myself and curse my fate,']

请注意,每个字符串值都以一个换行字符\n结束。除了文件的最后一行。与单个大字符串相比,字符串的列表通常更容易处理。

8.2.3 写入文件

Python允许你将内容写入文件,方式与print()函数将字符串“写”到屏幕上类似。但是,如果打开文件时用读模式,就不能写入文件。你需要以“写入纯文本模式”或“添加纯文本模式”打开该文件,或简称为“写模式”和“添加模式”。

写模式将覆写原有的文件,从头开始,就像你用一个新值覆写一个变量的值。将'w'作为第二个参数传递给open(),以写模式打开该文件。不同的是,添加模式将在已有文件的末尾添加文本。你可以认为这类似向一个变量中的列表添加内容,而不是完全覆写该变量。将'a'作为第二个参数传递给open(),以添加模式打开该文件。

如果传递给 open()的文件名不存在,写模式和添加模式都会创建一个新的空文件。在读取或写入文件后,调用close()方法,然后才能再次打开该文件。

让我们整合这些概念。在交互式环境中输入以下代码:

>>> baconFile = open('bacon.txt', 'w')
>>> baconFile.write('Hello world!\n')
13
>>> baconFile.close()
>>> baconFile = open('bacon.txt', 'a')
>>> baconFile.write('Bacon is not a vegetable.')
25
>>> baconFile.close()
>>> baconFile = open('bacon.txt')
>>> content = baconFile.read()
>>> baconFile.close()
>>> print(content)
Hello world!
Bacon is not a vegetable.

首先,我们以写模式打开bacon.txt。因为还没有bacon.txt,Python就创建了一个。在打开的文件上调用write(),并向write()传入字符串参数'Hello world! \n',将字符串写入文件,并返回写入的字符个数,包括换行符。然后关闭该文件。

为了将文本添加到文件已有的内容,而不是取代我们刚刚写入的字符串,我们就以添加模式打开该文件。向该文件写入'Bacon is not a vegetable.',并关闭它。最后,为了将文件的内容打印到屏幕上,我们以默认的读模式打开该文件,调用read(),将得到的内容保存在content中,关闭该文件,并打印content。

请注意,write()方法不会像print()函数那样,在字符串的末尾自动添加换行字符。必须自己添加该字符。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文