欢迎来到Python教程自学网!
当前位置: 首页 > Python基础教程 > Python中的文件读写-实际操作

Python中的文件读写-实际操作

   

Python中的文件读写-实际操作

Python中的文件读写-实际操作

用Python打开文件

你需要知道的第一个功能是open()。在Python 2和Python 3中,此命令将返回参数中指定的文件对象。基本功能用法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函数中的模式告诉Python你要对文件做什么。处理文本文件时可以指定多种模式。

'w'- 写入模式:当需要更改文件并更改或添加信息时,使用此模式。请记住,这会擦除现有文件以创建新文件。文件指针位于文件的开头。

'r'- 读取模式:当文件中的信息仅用于读取而不以任何方式更改时,使用此模式。文件指针位于文件的开头。

'a'- 附加模式:此模式自动将信息添加到文件末尾。文件指针放在文件的末尾。

'r+'- 读/写模式:当您要更改文件并从中读取信息时使用。文件指针位于文件的开头。

'a+'- 附加和读取模式:打开文件以允许将数据添加到文件末尾,并让程序也读取信息。文件指针放在文件的末尾。

使用二进制文件时,将使用相同的模式说明符。但是,您将ab添加到最后。所以二进制文件的写模式说明符是'wb'。其余的是'rb','ab','r+b',和'a+b'分别。

在Python 3中,添加了一个新模式:

'x'- 独占创建模式:此模式专门用于创建文件。如果已存在同名文件,则函数调用将失败。

我们来看一个如何打开文件和设置访问模式的示例。

使用该open()函数时,通常会将其结果赋给变量。给定一个名为的文件workData.txt,打开文件进行读写的正确代码如下:

data_file = open("workData.txt", "r+")

这将创建一个名为的对象data_file,然后我们可以使用Pythons 文件对象方法进行操作。

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

在Python中关闭文件

在阅读和写作时,了解如何关闭文件非常重要。

它释放了程序用于I / O目的的系统资源。编写具有空间或内存限制的程序时,可以有效地管理资源。

此外,关闭文件可确保将任何挂起的数据写入底层存储系统,例如本地磁盘驱动器。通过显式关闭文件,您可以确保刷新内存中的任何缓冲数据并将其写入文件。

在Python中关闭文件的功能很简单fileobject.close()。使用data_file我们在上一个示例中创建的文件对象,关闭它的命令将是:

data_file.close()

关闭文件后,在以后重新打开文件之前,您无法再访问该文件。尝试读取或写入已关闭的文件对象将引发ValueError异常:

>>> f = open("/tmp/myfile.txt", "w")
>>> f.close()
>>> f.read()Traceback (most recent call last):
  File "<input>", line 1, in <module>
    f.read()ValueError: I/O operation on closed file.

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

with open("workData.txt", "r+") as workData:
    # File object is now open.
    # Do stuff with the file:
    workData.read()
# File object is now closed.
# Do other things...

如果您不使用该with关键字或使用该fileobject.close()函数,那么Python将通过内置的垃圾收集器自动关闭并销毁文件对象。但是,根据您的代码,此垃圾收集可以随时进行。

所以建议使用with关键字来控制何时关闭文件 – 即在内部代码块完成执行之后。

使用Python文件对象

成功打开文件后,可以使用内置方法处理新文件对象。您可以从中读取数据,也可以向其中写入新数据。还有其他操作,如移动“读/写指针”,它确定从中读取文件数据的位置以及写入的位置。

接下来,将学习如何从打开的文件中读取数据:

在Python中从文件中读取数据

读取文件的内容使用该fileobject.read(size)方法。默认情况下,此方法将读取整个文件并将其作为字符串(在文本模式下)或字节对象(在二进制模式下)打印到控制台。

但是,使用默认大小时必须小心。如果您正在阅读的文件大于可用内存,则无法一次访问整个文件。在这种情况下,您需要使用该size参数将其分解为内存可以处理的块。

该size参数告诉read方法有多少字节进入文件返回显示。因此,我们假设我们的“workData.txt”文件中包含以下文本:

This data is on line 1
This data is on line 2
This data is on line 3

然后,如果您在Python 3中编写以下程序:

with open("workData.txt", "r+") as work_data:
    print("This is the file name: ", work_data.name)
    line = work_data.read()
    print(line)

你会得到这个输出:

This is the file name: workData.txt
This data is on line 1
This data is on line 2
This data is on line 3

另一方面,如果你调整第三行说:

line = workData.read(6)

您将获得以下输出:

This is the file name: workData.txt
This d

如您所见,读取操作仅读取文件中的数据到位6,这是我们传递给read()上面的调用的内容。这样,您可以一次性限制从文件中读取的数据量。

如果再次从同一文件对象中读取,它将继续读取您中断的数据。这样,您就可以在几个较小的“块”中处理大型文件。

逐行阅读文本文件 readline()

您还可以通过逐行读取来解析文件中的数据。这可以让您逐行扫描整个文件,只在您想要的时候前进,或者让您看到特定的行。

该fileobject.readline(size)方法默认返回文件的第一行。但是通过更改整数size参数,您可以获得所需文件中的任何行。

例如:

with open("workData.txt", "r+") as work_data:
     print("This is the file name: ", work_data.name)
     line_data = work_data.readline()
     print(line_data)

这将返回以下输出:

This is the file name:  workData.txt
This data is on line 1

将a 2或a 3作为size变量将相应地返回第二行或第三行。

类似的方法是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()是一种以较小的块处理大文本文件的舒适且有效的方式。

使用Python写入文件到Python write()

如果您无法向他们写入数据,那么文件就不会有任何好处。

请记住,当您创建新文件对象时,如果文件尚不存在,Python将创建该文件。首次创建文件时,您应该使用a+或w+模式。

通常最好使用该a+模式,因为数据将默认添加到文件的末尾。使用w+将清除文件中的任何现有数据,并为您提供“空白”。

在Python中写入文件的默认方法是使用fileobject.write(data)。例如,您可以使用以下代码在我们的“workData.txt”文件中添加一个新行:

work_data.write("This data is on line 4\n")

的\n充当新行指示,移动后续写入到下一行。

如果要将不是字符串的内容写入文本文件(例如一系列数字),则必须使用转换代码将它们转换或“转换”为字符串。

例如,如果要将整数1234,5678,9012添加到work_data文件中,则执行以下操作。首先,将非字符串转换为字符串,然后将该字符串写入文件对象:

values = [1234, 5678, 9012]with open("workData.txt", "a+") as work_data:
    for value in values:
        str_value = str(value)
        work_data.write(str_value)
        work_data.write("\n")

文件搜索:移动读/写指针

请记住,使用a+模式编写时,文件指针始终位于文件末尾。因此,在我们编写两个数字的情况下使用上面的代码,如果你使用这个fileobject.write()方法,你就不会得到任何回报。那是因为该方法正在寻找指向其他文本的指针。

那么你需要做的是将指针移回文件的开头。最简单的方法是使用该fileobject.seek(offset, from_what)方法。在此方法中,您将指针放在特定位置。

偏移量是from_what参数中的字符数。该from_what参数有三个可能的值:

0 – 表示文件的开头

1 – 表示当前指针位置

2 – 表示文件的结尾

当您使用文本文件(那些在模式下没有使用ab打开的文件)时,您只能使用默认值0或a seek(0, 2),它将带您到文件的末尾。

因此,通过work_data.seek(3, 0)在我们的“workData.txt”文件中使用,您将指针放在第4个字符处(请记住,Python开始计数为0)。如果使用行打印循环,则会得到以下输出:

s data is on line 1
This data is on line 2
This data is on line 3

如果要检查指针的当前位置,可以使用该fileobject.tell()方法,该方法返回当前文件中指针所在位置的十进制值。如果我们想查找当前work_data文件的时长,我们可以使用以下代码:

with open("workData.txt", "a+") as work_data:
    print(work_data.tell())

这将返回69,这是文件的大小。

使用Python编辑现有文本文件

您需要编辑现有文件而不是仅向其附加数据。你不能只使用w+模式来做到这一点。请记住,该模式w将完全覆盖该文件,因此即使使用fileobject.seek(),您也无法执行此操作。而且a+总是在文件的末尾插入任何数据。

最简单的方法是将整个文件拉出来并使用它创建列表或数组数据类型。创建列表后,您可以使用该list.insert(i, x)方法插入新数据。创建新列表后,您可以将其重新连接在一起并将其写回文件。

请记住,对于list.insert(i, x),i是一个整数,表示细胞数。然后将x的数据放在指示的列表中的单元格之前i。

例如,使用我们的“workData.txt”文件,假设我们需要在第一行和第二行之间插入文本行“这在第1行和第2行之间”。这样做的代码是:

# Open the file as read-only
with open("workData.txt", "r") as work_data:
    work_data_contents = work_data.readlines()
work_data_contents.insert(1, "This goes between line 1 and 2\n")
# Re-open in write-only format to overwrite old file
with open("workData.txt", "w") as work_data:
    work_dataContents = "".join(work_data_contents)
    work_data.write(work_data_contents)

运行此代码后,如果执行以下操作:

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

你会得到一个输出:

This data is on line 1
This goes between line 1 and 2
This data is on line 2
This data is on line 3

现在就演示了如何在Python中编辑现有的文本文件,在您想要的位置插入新的文本行。