Day4:使用python读写文件

北侠大卫 导师 2021-09-18 20:42:30

文件读写

前面的任务中,我们已经学会了使用python创建文件和目录,并能在指定目录中搜索目标文件,移动和复制文件,这一次我们将学习如何读写文件
,有了文件读写的知识作为基础,再结合我们前面任务的成果,我们就可以get更多的高效办公技能,在后面的任务中对批量图片进行缩放、加水印,也可以自动处理电子表格做表格的合并和拆分。

文件处理

如何读取文件

Python 有一个名为open的内置函数,我们可以使用它来打开文件进行读取。创建一个名为“test.txt”的文本文件,并输入以下内容:
这是一个测试文件
第2行
第3行
这行故意留空

以下是几个示例,展示了如何使用open读取文件:

handle = open("test.txt")

handle = open(r"C:\Users\baiyueguang\data\test.txt", "r")

第一个示例将以只读模式打开一个名为test.txt的文件。这是open函数的默认模式。第一个例子使用的是相对路径。Python 会自动在test.txt脚本运行的文件夹中查找。如果它没有找到它,那么您将收到一个 IOError。

第二个示例确实显示了文件的完全限定路径(绝对路径),但您会注意到它以“r”开头。这意味着我们希望 Python 将字符串视为原始字符串。让我们花点时间看看指定原始字符串与常规字符串之间的区别:

 >>> print("C:\Users\mike\py101book\data\test.txt")
 C:\Users\mike\py101book\data    est.txt
 >>> print(r"C:\Users\mike\py101book\data\test.txt")
 C:\Users\mike\py101book\data\test.txt

可以看到,当我们不将其指定为原始字符串时,我们会得到一个无效的路径。为什么会发生这种情况?在普通字符串中,有些特殊字符需要转义,例如“斜杠n”或“斜杠t”。在这种情况下,我们看到有一个“\t”(即一个制表符,从排版上看就是空了一一个很宽的空白)。

第二个例子中除了字符串前有一个r表示字符串是一个原始字符串以外,的第二个参数也是一个“r”。这两个r是不同的,第二个r告诉 open我们要以只读模式打开文件。
将以下行放入 Python 脚本并将其保存在与 test.txt 文件相同的位置:

handle = open("test.txt", "r")
data = handle.read()
print(data)
handle.close()

如果您运行它,它将打开文件并将整个文件作为字符串读取到数据变量中。然后我们打印该数据并关闭文件句柄。我们要记得,每次打开文件用完后都应该关闭文件句柄,因为您永远不知道其他程序何时要访问它。关闭文件还有助于节省内存并防止程序中出现奇怪的错误。我们可以告诉 Python 一次只读取一行,将所有行读入 Python 列表或分块读取文件。当需要处理非常大的文件并且不想读取整个文件时,最后一个选项非常方便。

让我们花一些时间研究读取文件的不同方法。

handle = open("test.txt", "r")
data = handle.readline() # 只读取一行
print(data)
handle.close()

如果您运行此示例,它只会读取文本文件的第一行并将其打印出来。一次只读一行,貌似不是很有用,我们换一个方法 readlines() 来一次读取所有行,两个函数看起来很像,读取多行的函数是带s的复数形式:

handle = open("test.txt", "r")
data = handle.readlines() # 读取所有行!
print(data)
handle.close()

运行此代码后,您将看到打印到屏幕上的 Python 列表,因为这是readlines方法返回的内容。

如何分块读取文件而不是一次读取所有

分块读取文件的最简单方法是使用循环。首先我们将学习如何逐行读取文件

handle = open("test.txt", "r")
for line in handle:
     print(line)
 
handle.close()

接着我们将学习如何一次读取一个 KB。我们将在第一个示例中使用for循环:
这里我们打开一个只读文件句柄,然后我们使用for循环对其进行迭代。你会发现你可以在 Python 中迭代所有类型的对象(字符串、列表、元组、字典中的键等)。那很简单,对吧?现在让我们分块完成!

handle = open("test.txt", "r")
 
while True:
     data = handle.read(1024)
     print(data)
     if not data:
         break

在这个例子中,我们使用 Python 的while循环一次读取 1 KB 的文件。您可能知道,千字节是 1024 个字节或字符。现在让我们假设我们想要读取一个二进制文件,比如 PDF。

如何读取二进制文件

读取二进制文件非常容易。您需要做的就是更改文件模式:

handle = open("test.pdf", "rb")

所以这次我们将文件模式改为rb,即 read-binary。您会发现,当您从 Internet 下载 PDF 或从 PC 到 PC 传输文件时,都可能需要读取二进制文件。

用 Python 编写文件

如果有其他语言编程经验,您可能会猜到用于写入文件的文件模式标志是什么:“w”和“wb”用于写入模式和写入二进制模式。让我们看一个简单的例子。

注意:使用“w”或“wb”模式时,如果文件已经存在,它将被覆盖而不会发出警告!您可以使用 Python 的os模块在打开文件之前检查文件是否存在。请参阅之前任务中的 os.path.exists函数用法。

handle = open("test.txt", "w")
handle.write("这是一个测试!")
handle.close()

那很简单!我们在这里所做的只是将文件模式更改为“w”,并调用文件句柄的write方法将一些文本写入文件。文件句柄还有一个writelines方法可以一次写入多行文本,该方法将接受一个字符串列表,然后句柄将按顺序写入磁盘。

使用 with 运算符

Python提供了with语法糖来帮我们减少资源操作导致的程序错误,可以用它简化读取和写入文件。使用with会建立一个上下文管理器,在Python遇到异常时,它会自动关闭文件句柄。让我们看看这是如何工作的:

with open("test.txt") as file_handler:
     for line in file_handler:
         print(line)

with运算符的语法有点奇怪,你只需要知道它背后帮助我们封装了一系列操作代码。我们只需要把之前的

handle = open("test.txt")

换成

with open("test.txt") as file_handler:

只要您在with代码块中,您就可以执行通常会执行的所有常用文件 I/O 操作。一旦离开该代码块,文件句柄将关闭,您将无法再使用它。是的,你没看错。您不再需要显式关闭文件句柄,因为with运算符会自动完成。有了with,我们的程序会变得健壮。

捕捉异常有时,当您处理文件时,会发生意外。该文件被锁定,因为其他程序正在使用它或者文件权限设置有误。发生这种情况时,可能会发生IOError。我们将了解如何以正常方式捕获错误以及如何使用with运算符捕获它们。提示:两者的想法基本相同!

 try:
     file_handler = open("test.txt")
     for line in file_handler:
         print(line)
 except IOError:
     print("An IOError has occurred!")
 finally:
     file_handler.close()

在上面的示例中,我们将常用代码包装在try/except 结构中。如果发生错误,我们会在屏幕上打印一条消息。请注意,我们还确保使用finally 语句关闭文件。现在我们准备看看如何使用with来做同样的事情:

 try:
     with open("test.txt") as file_handler:
         for line in file_handler:
             print(line)
 except IOError:
     print("An IOError has occurred!")

您可能已经猜到了,我们只是以与前面示例中相同的方式包装with块。这里的区别在于我们不需要finally语句,因为上下文管理器会为我们处理它。

...全文
535 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
YU. AN 7天学习首期学员 2021-09-22
  • 打赏
  • 举报
回复
此人很懒一月一改 7天学习首期学员 2021-09-22
  • 打赏
  • 举报
回复
nit. 7天学习首期学员 2021-09-22
  • 打赏
  • 举报
回复
入坑准程序猿 7天学习首期学员 2021-09-22
  • 打赏
  • 举报
回复
poqweur 2021-09-22
  • 打赏
  • 举报
回复
变瘦的鹏少 7天学习优秀学员 2021-09-20
  • 打赏
  • 举报
回复

11,846

社区成员

发帖
与我相关
我的任务
社区描述
创建由Python学习者和社区专家组成的国内最大的第三方Python中文社区,帮助社区成员更好地入门学习、职业成长和应用实践
python学习 企业社区
社区管理员
  • Python全栈技术社区
  • Lumos_zbj
  • 北侠大卫
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

创建由Python学习者和社区专家组成的国内最大的第三方Python中文社区,帮助社区成员更好地入门学习、职业成长和应用实践

  • 这里有最新最全的 Python 学习内容及资源,每月多达4次技术公开课
  • 这里有众多 Python 学习者,陪伴你一起交流成长
  • 这里有专业 Python 社区专家、讲师,帮助你跨越学习瓶颈,解决实操难题
  • 这里有丰富的社区活动,可以开阔眼界,结识更多同伴

【最新活动】:

  1. 周四技术公开课讲师招募中,点击查看详情
  2. “Python 社区专家团” 招募中,点击查看详情

 

试试用AI创作助手写篇文章吧