Python中IO文件处理(1)

如何从文件中读取数据,如何向文件写入数据, 查找什么文件,以及为什么应该关闭文件。


下面是IO文件处理的内容:
    1.二进制文件和文本文件之间的区别
    2.在哪里可以找到Python的内置文件I/O函数和工具
    3.如何在Python中打开和关闭文件
    4.在Python中从文件读取数据的各种方法
    5.如何写数据到一个文件对象在Python
    6.文件寻找在Python和移动读/写指针
    7.用Python编辑现有的文本文件




1.二进制与Python中的文本文件

Python可以处理两种不同类型的文件:二进制文件和文本文件。了解两者之间的区别是很重要的,因为它们是如何处理的。 您在正常计算机使用期间使用的大多数文件实际上是二进制文件,而不是文本。没错,那个Microsoft Word .doc文件实际上是一个二进制文件,即使里面只有文本。二进制文件的其他例子包括:     图像文件包括.jpg, .png, .bmp, .gif等
    数据库文件,包括.mdb,.frm和 .sqlite
    文档包括.doc、.xls、.pdf等。 这是因为这些文件都需要特殊的处理,并且需要特定类型的软件来打开它。例如,需要Excel来打开.xls文件,需要数据库程序来打开.sqlite文件。 另一方面,文本文件没有特定的编码,可以由标准的文本编辑器打开,无需任何特殊处理。但是,每个文本文件必须遵守一组规则: 文本文件必须是可读的。它们可以也总是包含许多特殊的编码,特别是HTML或其他标记语言,但您仍然能够知道它说的是什么。
文本文件中的数据是按行组织的。在大多数情况下,每一行都是一个独立的元素,无论是指令行还是命令行。 此外,文本文件在每一行的末尾都有一个不可见的字符,这让文本编辑器知道应该有一个新行。当通过编程与这些文件交互时,您可以利用该字符。在Python中,它由“\n”表示。





2.在哪里可以找到Python的文件I/O工具

在Python中工作时,不必担心导入任何特定的外部库来处理文件。Python附带了“内置功能”,文件I/O工具和实用程序是核心语言的内置部分。

在其他语言如c++中,要处理文件,你必须通过包含正确的头文件来启用文件I/O工具,例如#include <fstream>。如果您使用Java编写代码,则需要导入Java .io.*声明。 对于Python,这是不必要的
相反,Python有一个内建的函数集,可以处理读写文件所需的所有内容。现在我们来仔细看看。




3.如何在Python中打开和关闭文件




    3.1.用Python打开一个文件

您需要知道的第一个函数是open()。在python2和python3中,这个命令将返回一个在参数中指定的file对象。
open()的基本函数用法如下:

file_object = open(filename, mode)
在此实例中,filename是要与之交互的文件的名称,其中包含文件扩展名。也就是说,如果您有一个名为workData.txt的文本文件,你的文件名不只是“workData”。这是“workData.txt”。

如果你使用的是Windows,您还可以指定文件所在的确切路径,例如“C:\ThisFolder\workData.txt”。 对于Python来说,字符串中的一个反斜杠表示字符串字面量的开始。所以这里有个问题,因为这两个意思会冲突… 幸运的是,Python有两种方法来处理这个问题。 首先是使用双反斜杠,像这样:“C:\\ThisFolder\\workData.txt”。 第二种是使用斜杠:“C:/ThisFolder/workData.txt”。 open函数中的(mode)模式告诉Python您想对文件做什么。在处理文本文件时,可以指定多种模式。


'w' -写入模式:当需要更改文件和更改或添加信息时使用此模式。请记住,这将擦除现有文件以创建一个新文件。文件指针位于文件的开头。
'r' -读取模式:当文件中的信息仅用于读取且不以任何方式更改时使用此模式。文件指针位于文件的开头。
“a”-附加模式:此模式自动在文件末尾添加信息。文件指针放置在文件的末尾。
'r+' -读/写模式:当你要修改文件并从中读取信息时使用。文件指针位于文件的开头。
'a+' -追加和读取模式:打开一个文件,允许数据被添加到文件的末尾,也让你的程序读取信息。文件指针放置在文件的末尾。
在使用二进制文件时,将使用相同的模式说明符。但是,在末尾添加一个b。所以二进制文件的写模式说明符是'wb'。其他的分别是'rb', 'ab', 'r+b'和'a+b'。
在python3中,添加了一个新模式:
    'x' -独占创建模式:该模式专门用于创建文件。如果已经存在同名文件,则函数调用将失败。 让我们通过一个示例来了解如何打开文件并设置访问模式。 在使用open()函数时,通常会将其结果分配给变量。给定一个名为workData.txt的文件,打开文件进行读写的正确代码如下:

data_file = open("workData.txt", "r+")
这将创建一个名为data_file的对象,然后我们可以使用Pythons文件对象方法对其进行操作。

在这个代码示例中,我们使用了'r+'访问模式,它告诉Python我们要打开文件进行读写。这给了我们很大的灵活性,但通常你可能想限制你的程序只读或只读一个文件,这就是其他模式派上用场的地方。




    3.2.在Python中关闭文件

当你读写文件时,知道如何关闭文件是很重要的。 它释放程序用于I/O目的的系统资源。当编写有空间或内存限制的程序时,这可以让您有效地管理资源。 另外,关闭文件可以确保将所有挂起的数据写入底层存储系统,例如本地磁盘驱动器。通过显式关闭文件,可以确保内存中保存的所有缓存数据都被清除并写入文件。 在Python中关闭文件的函数是fileobject.close()。使用我们在前面示例中创建的data_file文件对象,关闭它的命令为:

data_file.close()

在关闭文件后,您不能再访问它,直到您在以后重新打开它。试图读取或写入一个关闭的文件对象将抛出一个ValueError异常:

在Python中,打开和关闭文件的最佳实践使用with关键字。这个关键字在嵌套代码块完成后自动关闭文件:

如果不使用with关键字或使用fileobject.close()函数,那么Python将通过内置的垃圾收集器自动关闭并销毁文件对象。但是,根据您的代码,这种垃圾收集可以在任何时候发生。 因此,建议使用with关键字来控制何时关闭文件——即在内部代码块完成执行之后。




    3.3.使用Python文件对象

一旦成功打开文件,就可以使用内置方法来处理新的file对象。您可以从中读取数据,或向其写入新数据。还有其他的操作,比如移动“读/写指针”,它决定了数据从文件的什么地方读取和写到什么地方。我们稍后会在教程中看到。 接下来你将学习如何从你打开的文件中读取数据:




4.从Python文件中读取数据

读取文件的内容使用fileobject.read(size)方法。默认情况下,此方法将读取整个文件,并将其作为字符串(文本模式)或字节对象(二进制模式)打印到控制台。 但是,在使用默认大小时必须小心。如果正在读取的文件大于可用内存,则无法一次访问整个文件。在这种情况下,需要使用size参数将其分解为内存可以处理的块。 size参数告诉read方法文件中有多少字节需要返回给显示器。所以让我们假设我们的“workData.txt”文件中有以下文本:

然后,如果你写以下程序在python3:

你会得到这样的输出:

另一方面,如果你调整第三行代码为:

line = workData.read(6)

您将得到以下输出:

This is the file name: workData.txt
This d 

如您所见,read操作仅将文件中的数据读取到位置6,也就是我们传递给上面的read()调用的位置。这样就可以限制一次从文件中读取的数据量。 如果您再次从同一个文件对象读取数据,它将继续从您中断的地方读取数据。这样您可以将一个大文件处理为几个较小的“块”。

使用readline()逐行读取文本文件 您还可以通过逐行读取文件中的数据来解析文件中的数据。这可以让您逐行扫描整个文件,只有当您想前进时,或让您看到特定的行。 fileobject.readline(size)方法默认返回文件的第一行。但是通过更改整数大小参数,您可以在文件中获得所需的任何行。 例如:

   

这将返回输出:

   

可以反复调用readline()从文件中读取其他文本行。 类似的方法是fileobject.readlines()调用(注意复数形式),它返回文件中所有行的列表。例如:

print(work_data.readlines())

您将得到以下输出:

['This data is on line 1', 'This data is on line 2', 'This data is on line 3']

如您所见,这将把整个文件读入内存,并将其分成几行。但是,这只对文本文件有效。二进制文件只是一团数据——它并没有真正理解一行是什么。

逐行处理整个文本文件 在Python中,逐行处理整个文本文件的最简单方法是使用一个简单的循环:

with open("workData.txt", "r+") as work_data:
    for line in work_data:
        print(line)

以下输出:

This data is on line 1
This data is on line 2
This data is on line 3
这种方法非常节省内存,因为我们将分别读取和处理每一行。这意味着我们的程序不需要立即将整个文件读入内存。因此,使用readline()是一种以较小的块处理大文本文件的舒适而有效的方法。



转载翻译:https://dbader.org/blog/python-file-io

本文标签: python文件处理 pythonIO处理
转载声明:本文为网中小南的原创文章,转载请注明原文地址,谢谢合作

发表评论: