- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
8.2 文件读写过程
在熟悉了处理文件夹和相对路径后,你就可以指定文件的位置,进行读写。接下来几节介绍的函数适用于纯文本文件。“纯文本文件”只包含基本文本字符,不包含字体、大小和颜色信息。带有.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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论