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+'- 附加和读取模式:
打开文件以允许将数据添加到文件末尾,并让程序也读取信息。文件指针放在文件的末尾。
使用二进制文件时,将使用相同的模式说明符。但是,你将a
b
添加到最后。所以二进制文件的写模式说明符是'wb'。其余的是'rb','ab','r+b',和'a+b'分别。
在Python 3中,添加了一个新模式:
'x'- 独占创建模式
:此模式专门用于创建文件。如果已存在同名文件,则函数调用将失败。
让我们看一个如何打开文件并设置访问模式的示例。
使用该open()函数时,通常会将其结果赋给变量。给定一个名为的文件workData.txt,打开文件进行读写的正确代码如下:
data_file = open("workData.txt", "r+")
这将创建一个名为 data_file 的对象,然后我们可以使用 Python 的文件对象方法对其进行操作。
我们'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) 方法默认返回文件的第一行。但是通过更改整数大小参数,你可以获得所需文件中的任何行。
例如:
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 或 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”文件,假设我们需要在第一行和第二行之间插入文本行“This is between lines 1 and 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中编辑现有的文本文件,在你想要的位置插入新的文本行。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python如何通过日志分析加入黑名单12/06
- ♥ 如何解决python导出excel乱码10/29
- ♥ 没有基础知识能学python吗?12/17
- ♥ 如何在手机上学习python11/21
- ♥ python3类中的Dog是如何进行转换的?01/13
- ♥ 这是我见过最好的NumPy图解教程!02/17
内容反馈