如何在 Python 中处理文件

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 中列表的长度。