Python 文件处理详解
在任何编程语言中,文件操作都至关重要。Python 提供了多种模式来处理文件,例如读取、写入等等。本文将深入探讨 Python 中的文件处理方法。
阅读完本教程后,您将能够:
- 在 Python 中打开并读取文件。
- 从文本文件中逐行读取内容。
- 向文件中写入或追加内容。
- 利用上下文管理器在 Python 中高效地管理文件。
Python 中读取文件的方法
在 Python 中,可以使用open('文件名', '模式')
的通用语法来打开文件。
- 其中,
文件名
指的是你想要操作的文件的名称。
注意:如果文件与你的脚本在同一目录下,则只需提供文件名即可。否则,你需要提供文件的完整路径。
模式
参数则用于指定你希望以何种方式打开文件。
文件默认以读取模式打开,用字母“r”表示。为了清晰起见,建议明确指定模式。
在开始之前,我们先来看一个名为lib.txt
的文本文件,我们将在接下来的示例中使用它。
📁 下载本教程中使用的文本文件和代码:GitHub 仓库
以下代码展示了如何使用open()
函数打开lib.txt
并读取其内容:
file = open('lib.txt','r') contents = file.read() print(contents) file.close() # 输出结果 # Hello, there! # Here are a few helpful Python libraries: # 1) NumPy # 2) pandas # 3) matplotlib # 4) seaborn # 5) scikit-learn # 6) BeautifulSoup # 7) Scrapy # 8) nltk # 9) Bokeh # 10) statsmodels
在上面的例子中:
open()
函数返回一个文件对象,我们将其命名为file
。- 接着,我们调用文件对象的
read()
方法。 - 变量
contents
现在存储了文件的完整内容,我们将内容打印出来。 - 最后,我们关闭了文件。
然而,如果你忘记关闭文件,可能会导致资源浪费。如果处理大量文件,这将占用大量内存,因为你打开了许多文件却没有关闭它们。
现在,让我们学习一种更好的方法——使用上下文管理器来打开文件。以下代码演示了如何使用:
with open('lib.txt','r') as f: contents = f.read() print(contents)
使用上下文管理器处理文件,你无需显式调用close()
方法,I/O操作完成后文件会自动关闭。
Python 中逐行读取文件
在我们的示例文件中,只有少量几行,因此一次读取整个文件内容不成问题。
但是,当处理大型文件时,如上所述使用read()
方法可能效率不高。如果文件过大,可能会导致内存溢出。因此,按行读取文件内容可能更加合适。本节将介绍如何实现此操作。
使用 readline()
方法逐行读取
readline()
方法一次从文件中读取一行。
运行以下代码:
with open('lib.txt','r') as f: line = f.readline() print(line) line = f.readline() print(line) # 输出结果 # Hello, there! # # Here are a few helpful Python libraries:
可以看出,第一次调用readline()
后,文件的第一行被打印出来。第二次调用则返回文件的第二行。
这是因为,第一次调用后,文件指针移动到下一行的开头。
在 Python 中,可以使用tell()
方法来获取文件指针的当前位置。要将文件指针移动到指定位置,可以使用seek()
方法。
在以下代码中,我们在第一次调用后使用了 f.seek(0)
,这将文件指针移动到文件的开头。因此,文件的第一行被打印了两次。
with open('lib.txt','r') as f: line = f.readline() print(line) f.seek(0) line = f.readline() print(line) # 输出结果 # Hello, there! # # Hello, there!
使用 readlines()
方法读取所有行
还有一个密切相关的方法称为readlines()
。
运行以下代码,你会看到readlines()
方法返回一个包含文件中所有行的列表。
with open('lib.txt','r') as f: lines = f.readlines() print(lines) # 输出结果 # ['Hello, there!\n', 'Here are a few helpful Python libraries:\n', '1) NumPy\n', '2) pandas\n', '3) matplotlib\n', '4) seaborn\n', '5) scikit-learn\n', '6) BeautifulSoup\n', '7) Scrapy\n', '8) nltk\n', '9) Bokeh\n', '10) statsmodels\n', '\n']
使用 for
循环读取文件
你还可以使用 for
循环来逐行读取文件内容。
一旦你拥有了一个文件对象,就可以使用 for
循环遍历文件内容,一次读取一行并打印。 注意到我们每次只访问一行,而不是读取整个文件内容。
with open('lib.txt','r') as f: for line in f: print(line, end='')
注意:Python 的 print()
函数默认使用换行符(’\n’)作为分隔符。由于原始文件中不包含这些换行符,我们将分隔符设置为空字符串 end=''
,以便按原样打印文件内容。
Python 中读取文件块
在 Python 中,还可以选择以小块的形式读取文件内容。
以下代码示例中:
- 我们将
chunk_size
设置为 50,这意味着将读取文件的前 50 个字符并打印出来。 - 然后,我们调用文件对象的
tell()
方法。 你可以看到文件指针现在位于位置 51,正如预期一样。
chunk_size = 50 with open('lib.txt','r') as f: chunk = f.read(chunk_size) print(chunk) current = f.tell() print(f"Current position of file pointer: {current}") # 输出结果 # Hello, there! # Here are a few helpful Python librar # Current position of file pointer: 51
你还可以使用这种技术以小块的形式读取整个文件。以下代码展示了如何实现:
chunk_size = 50 with open('lib.txt','r') as f: chunk = f.read(chunk_size) print(chunk,end='') while(len(chunk)>0): chunk = f.read(chunk_size) print(chunk,end='') # 输出结果 # Hello, there! # Here are a few helpful Python libraries: # 1) NumPy # 2) pandas # 3) matplotlib # 4) seaborn # 5) scikit-learn # 6) BeautifulSoup # 7) Scrapy # 8) nltk # 9) Bokeh # 10) statsmodels
这里,我们使用 while
循环读取文件内容,每次读取 50 个字符,直到文件末尾。
Python 中写入文件
为了在 Python 中写入文本文件,应该以写入模式打开文件,用“w”表示。
以下代码展示了如何操作:
with open('new_file.txt','w') as f: f.write('Hello, Python!')
你会发现,工作目录中已经创建了一个名为new_file.txt
的文件。
再次运行上面的代码。然后在终端中运行以下命令:
cat new_file.txt # 输出结果: Hello, Python!
正常来说,我们已经写入文件两次。所以“Hello, Python!” 应该打印两次吧?
但是,你会发现它只打印了一次。这是因为,以写入 (w) 模式打开文件时,你实际上是用新内容覆盖了文件的原有内容。
如果你想在不覆盖原有内容的情况下,将内容追加到文件末尾,应该以追加模式打开文件。下一节将介绍如何实现。
Python 中追加文件
若要将内容添加到文件末尾而不覆盖原有内容,请以追加模式打开文件。
为此,请使用 “a” (表示 append 追加),并明确指定模式。
接下来,运行以下代码两次:
with open('new_file.txt','a') as f: f.write('Hello, Python!')
你会发现文本打印了两次,因为我们附加了内容到文件中。
cat new_file.txt # 输出结果: Hello, Python!Hello, Python!
总结
让我们快速回顾一下本教程中讨论的内容:
- 你学习了常见的文件I/O操作,如读取、写入和追加文件。
- 你还学习了如何使用
seek()
方法将文件指针移动到特定位置。 - 以及如何使用
tell()
方法检索文件指针的当前位置。
希望本教程对你有所帮助。既然你已经学会了如何处理文本文件,接下来可以学习一下如何在 Python 中处理 JSON 文件。
相关链接:
三步检查 Python 中列表的长度。