如何在Python中创建,读取,追加和写入文件

时间:2020-02-23 14:43:41  来源:igfitidea点击:

在本教程中,我们将学习如何使用文件,以便程序可以快速分析大量数据。我们将主要与open()函数一起使用以使用Python编程语言创建,读取,追加或者写入文件。

  • 如何创建一个空文件

  • 如何读取文本文件的内容

  • 如何写文件

  • 如何将新内容添加到现有文件

我们将如何在GUI环境中写入文件?

让我们以非常基本的外行术语来理解。我假设大多数人都具有Windows环境的经验,因此要使用图形界面在某些记事本中写入文件,我们会怎么做?

  • 创建一个新的文本文件(如果尚不存在)

  • 打开文件进行编辑

  • 将数据写入文件

  • 保存文件

  • 完成后关闭文件

在使用文本文件执行读/写操作时,我们在Python中采用了类似的方法。

使用open()函数打开文件的语法

要使用open()函数打开文件,请向其传递一个字符串路径,该路径指示我们要打开的文件。它可以是绝对路径,也可以是相对路径。

语法1:与open()一起使用

在Python中打开文件的syntax为:

with open('<PATH/OF/FILE>','<MODE>') as <FILE_OBJECT>:
  • open()函数需要一个参数:我们要打开的文件的名称。

  • Python在存储当前正在执行的程序的目录中查找此文件。

  • 因此,建议对提供的文件使用绝对或者相对路径。

  • open()函数返回一个代表文件的" FILE_OBJECT"。根据选择,该" FILE_OBJECT"可以是任何变量。

  • 接下来,我们必须分配一个" MODE"来打开文件。

我们可以从以下可用的Python模式中进行选择:

模式是什么
“x”创建新的空文件
“r'文件必须已经存在,并且它以只读模式打开。
“w”文件以只读写模式打开。如果文件已存在,则文件将被截断为零长度,并覆盖该文件,或者如果不存在,则会创建该文件。
“a'文件以只读写模式打开。如果文件已经存在,则文件将保持完整,并且我们编写的数据将添加到文件中已经存在的内容中。如果文件不存在,则创建该文件。
“r+”;文件必须已存在,并且已打开以进行读写
“w+”;打开文件进行读写。如果文件已经存在,或者在不存在时创建文件,则会截断并覆盖该文件。
“a+”;打开文件进行读写。如果文件已经存在,则文件将保持完整,并且我们编写的数据将添加到文件中已经存在的内容中。如果文件不存在,则创建该文件。

我们还可以选择在以下位置打开文件:

  • 文字模式(t)

  • 二进制模式(b)

提示:

因此,如果我们希望以"写+二进制"模式打开文件,则应指定" wb"。默认情况下," open()"将以文本模式打开文件,因此我们不必在每次对文本文件使用" open()"时都提供" t"。

语法2:使用open()和close()

  • 另外,我们也可以通过直接使用open()函数并将其分配给FILE_OBJECT来打开文件。

  • 这个" FILE_OBJECT"可以再次是任何变量。

  • 我们可以使用与上面讨论的格式相同的相同模式集。

  • 唯一的区别是,一旦处理完文件,我们必须提供close()函数。

FILE_OBJECT = open('<PATH/OF/FILE>','<MODE>')
# read write operations
FILE_OBJECT.close()

我应该使用哪种语法(与open()或者open()一起使用)?

  • 一旦不再需要访问文件时,关键字close()就会关闭文件。

  • 我们必须已经注意到,在此程序中使用的是我们所谓的" open()",而不是" close()"。

  • 我们可以分别通过调用open()和close()函数来打开和关闭文件,但是如果程序中的错误阻止了执行close()方法,则该文件可能永远不会关闭。

  • 这看似微不足道,但是不正确地关闭文件可能会导致数据丢失或者损坏。

  • 而且,如果我们在程序中过早调用close(),就会发现自己尝试使用关闭的文件(我们无法访问的文件),这会导致更多错误。

  • 确切地知道何时应该关闭文件并不总是很容易,但是使用with open()python会为我们解决这个问题。

  • 我们所需要做的就是打开文件并根据需要对其进行"处理",并相信Python将在with块执行完后自动将其关闭。

如何创建一个空文件

示例1:使用touch()

理想情况下,如果我们只是想创建一个空文件,则可以使用如下所示的touch()函数或者使用touch命令调用subprocess.call:

#!/usr/bin/env python3
from pathlib import Path
Path('/tmp/file.txt').touch()

这将在/tmp /下创建一个空文件。

# python3 file_operator.py

验证是否创建了新文件:

# ls -l /tmp/file.txt
-rw-r--r-- 1 root root 0 May 19 11:08 /tmp/file.txt

示例2:与open()一起使用

但是由于本教程是关于open()with open()的,因此我们将这些功能与不同模式结合使用来创建一个空文件。接下来,我们将使用with open(),如下所示。其中我使用file_object作为FILE_OBJECT的变量名,我们可以使用任何其他变量。

#!/usr/bin/env python3
with open('/tmp/file.txt', 'x') as file_object:
    pass

其中我们将使用x来创建/tmp/file.txt,这意味着"创建一个空文件"。

执行脚本:

Python创建文件失败(如果文件存在)

该脚本失败,并显示错误文件存在。

说明:

将x与open()一起使用时,我们可以创建一个空文件,前提是该文件不存在。如果提供的文件已经存在,则创建操作将失败。

因此,我们将删除退出的/tmp/file.txt并重新执行脚本:

# rm -f /tmp/file.txt
# python3 file_operator.py

因此,现在就创建了新文件。

# ls -l /tmp/file.txt
-rw-r--r-- 1 root root 0 May 19 11:15 /tmp/file.txt

示例3:使用open()

我们还可以使用以下格式的open()函数:

#!/usr/bin/env python3
file_object =  open('/tmp/file.txt', 'x')
file_object.close()

并且这还将继续并创建一个空文件/tmp/file.txt(如果尚不存在)

如何读取文件内容

现在我们有了File object,我们可以开始读取它了。可以采用不同的方式来读取文件的内容,我们将在本节中通过不同的示例进行学习:

读取文件内容的基本语法为:

with open('<PATH/OF/FILE>','r') as <FILE_OBJECT>:
    FILE_OBJECT.read()

或者

FILE_OBJECT = open('<PATH/OF/FILE>','r')
FILE_OBJECT.read()

这里我们使用" r",即带有open()函数的读取模式。要实际读取内容,我们需要将read()与文件对象值一起使用。

在下面的示例中,我将使用此dataFile测试我们的read()操作。

# cat dataFile
some date-1 5
some data-2 10
some data-3 15

示例1:以字符串形式读取文件的内容

如果我们想读取文件的全部内容作为字符串值,请使用File对象的read()方法。

#!/usr/bin/env python3
# Open the file in read mode
file_object =  open('dataFile', 'r')
# Store the content of file in content var.
# You can use any name for this variable
content = file_object.read()
# print the content
print(content)
# Close the file object of file
file_object.close()

执行脚本:

# python3 file_operator.py
some date-1 5
some data-2 10
some data-3 15

说明:

与原始文件相比,我们可能会在此脚本的输出中观察到额外的换行符。空行出现是因为read()到达文件末尾时将返回一个空字符串。该空字符串显示为空白行。如果要删除多余的空白行,可以在对print()的调用中使用rstrip()

因此,要从最后一行删除换行符,我们的代码应如下所示:

#!/usr/bin/env python3
# Open the file in read mode
file_object =  open('dataFile', 'r')
# Store the content of file in content var.
# You can use any name for this variable
content = file_object.read()
# print the content
print(content.rstrip())
# Close the file object of file
file_object.close()

现在,这不应在打印输出的末尾添加任何新行。

open()函数一起使用

#!/usr/bin/env python3
# Open the file in read mode
with open('dataFile', 'r') as file_object:
    # Store the content of file in content var.
    # You can use any name for this variable
    content = file_object.read()
# print the content
print(content.rstrip())

该脚本的输出:

# python3 file_operator.py
some date-1 5
some data-2 10
some data-3 15

示例2:逐行读取文件的内容

在阅读文件时,我们通常会需要检查文件的每一行。我们可能正在文件中寻找某些信息,或者我们想要以某种方式修改文件中的文本。

  • 我们可以在文件对象上使用" for"循环来一次检查文件中的每一行

  • 在此示例中,我们将文件及其路径分配给filename变量

  • 我们再次使用with语法让Python正确打开和关闭文件。

  • 要检查文件的内容,我们通过遍历文件对象来遍历文件中的每一行

#!/usr/bin/env python3
filename = '/root/scripts/dataFile'
# Open the file in read mode
with open(filename, 'r') as file_object:
    for line in file_object:
        print(line)

此脚本的输出。当我们打印每一行时,我们会发现更多的空白行。之所以出现这些空白行,是因为文本文件中每行的末尾都包含一个不可见的newline字符。每次调用print函数时,都会添加自己的" newline"字符,因此每行末尾都有两个" newline"字符,一个来自文件,一个来自" print()"。

# python3 file_operator.py
some date-1 5
some data-2 10
some data-3 15

print()调用的每一行上使用rstrip()消除了这些多余的空白行。使用rstrip()更新了脚本

#!/usr/bin/env python3
filename = '/root/scripts/dataFile'
# Open the file in read mode
with open(filename, 'r') as file_object:
    for line in file_object:
        print(line.rstrip())

该脚本的输出:

# python3 file_operator.py
some date-1 5
some data-2 10
some data-3 15

示例3-将文件中的内容存储在列表中(readlines())

  • 当使用with时,由open()返回的文件对象仅在包含它的with块内可用。

  • 如果要保留对with块之外的文件内容的访问权限,可以将文件的行存储在块内的列表中,然后使用该列表。

  • 我们可以立即处理文件的某些部分,并将某些处理推迟到以后在程序中进行。

#!/usr/bin/env python3
filename = '/root/scripts/dataFile'
# Open the file in read mode and store the content in file_object
with open(filename, 'r') as file_object:
    # Use readlines() to store the content in lines variable as a List
    lines = file_object.readlines()
# Use for loop outside the scope of with open() and
# print the content of lines
for line in lines:
    print(line.rstrip())

该脚本的输出:

# python3 file_operator.py
some date-1 5
some data-2 10
some data-3 15

示例4-执行简单的计算

现在,当我们知道如何在python中读取文件时,让我们利用它执行一些基本的添加操作。在此脚本中,我们将计算第三列的值并打印total。我已经在脚本的注释部分解释了每一行

filename = '/root/scripts/dataFile'
total = 0.0
# Open the file in write mode and store the content in file_object
with open(filename, 'r') as file_object:
    for line in file_object:
        # Split the line based on whitespace character
        parts = line.split( )
        # Convert the value into integer of 3rd column
        parts[2] = int(parts[2])
        # Add all the values from third column
        total += parts[2]
# Print the total
print(total)

该脚本的输出:

# python3 file_operator.py
30.0

示例5:使用格式读取和对齐数据

在这个例子中,我们将从datafile中读取内容,并使用print格式,使该文件的内容对齐。我已经添加了足够的注释来解释代码的每一行。

#!/usr/bin/env python3
filename = '/root/scripts/dataFile'
# Open the file in write mode and store the content in file_object
with open(filename, 'r') as file_object:
    # This section would be executed only if with is successful
    # Print a formatted string with First and Second is left aligned with a value of 10
    # and Third is right aligned with a value of 5
    print(f'{"First":<10}{"Second":<10}{"Third":>5}')
    for line in file_object:
        # Split the line based on whitespace character
        parts = line.split( )
        # Arrange the line content with the provided format
        # as we had used earlier for alignment
        print(f'{parts[0]:<10}{parts[1]:<10}{parts[2]:>5}')

如何写文件

  • 要将文本写入文件,我们需要使用第二个参数w调用open(),即,写入模式告诉Python我们要写入文件。

  • 我们应谨慎使用" w",因为它会"覆盖文件的现有内容"。

  • 如果提供的文件不存在,w将创建一个新文件并开始写入该文件

  • 如果文件已经存在一些数据,w将覆盖内容,然后将数据写入该文件。

示例1:写入一个空文件

我们可以使用open()或者open(),因为open()更灵活,更现代,我将在所有示例中仅使用它。但是我希望我们已经了解了open()的语法,因此可以相应地移植它们。

在本示例中,我们将创建一个新文件(/tmp/someData.txt),并将一些内容放入该文件中

#!/usr/bin/env python3
filename = '/tmp/someData.txt'
# Open the file in write mode and store the content in file_object
with open(filename, 'w') as file_object:
    file_object.write("Python write to file\n")

执行此脚本:

# python3 file_operator.py

如预期的那样,该程序没有终端输出,但是我们可以检查是否创建了/tmp/someData.txt并验证其内容:

# cat /tmp/someData.txt
Python write to file

说明:

Python只能将字符串写入文本文件。如果要将数字数据存储在文本文件中,则必须先使用str()函数将数据转换为字符串格式。

示例2:编写多行

如果我们观察前面的示例,则我在打印字符串的末尾添加了\ n。 write()函数不会在我们编写的文本中添加任何换行符。因此,如果我们在不包含换行符的情况下编写了多行内容,则文件的外观可能不符合期望。因此,我们将使用\ n新行字符将多行写入文本文件。

#!/usr/bin/env python3
filename = '/tmp/someData.txt'
# Open the file in write mode and store the content in file_object
with open(filename, 'w') as file_object:
    file_object.write("First line\n")
    file_object.write("Second line\n")

执行脚本并观察/tmp/someData.txt的内容

# cat /tmp/someData.txt
First line
Second line

示例3:执行搜索并修改文件内容

在此示例中,我们将执行一些搜索,然后修改文件的内容,然后将其存储到单独的文件中。我们已经有一个具有以下内容的dataFile

# cat /root/scripts/dataFile
some date-1 5
some data-2 10
some data-3 15

我们希望在第三列的第二行中将值替换为10到20,因此我们将使用带有open()函数的读写方法,并将更新后的内容写入新文件/tmp/temp_file.txt中。

#!/usr/bin/env python3
in_f = '/root/scripts/dataFile'
out_f = '/tmp/temp_file.txt'
# Open the file in read mode and store the content in input_f
input_f = open(in_f, 'r')
# Open the file in write mode and store the content in output_f
output_f = open(out_f, 'w')
# Access both the files using with
with input_f, output_f:
    # Run a loop for each line in the input file
    for line in input_f:
        # Split the content using whitespace character and store each field in first, second and third
        first, second, third = line.split( )
        # If third column doesn't contain 10 then just add the line in output file
        if third != '10':
            output_f.write(line)
        else:
            # if third column contains 10, then replace the whole line
            # with provided list
            new_line = ' '.join([first, second, '20'])
            # Add a new line at the end of above List
            output_f.write(new_line + "\n")

该脚本的输出:

# cat /tmp/temp_file.txt
some date-1 5
some data-2 20
some data-3 15

因此,第二行的第三列已正确更新为新值20

提示:

我们可以使用fileinput在同一文件中执行搜索和替换,而当前不在本教程范围之内。

我可能会写另一个关于这个主题的教程。

如何将内容添加到文件

  • 如果要向文件中添加内容而不是覆盖现有内容,则可以在"追加"模式下打开文件。

  • 当我们以"追加"模式打开文件时,Python不会在返回文件对象之前清除文件的内容。

  • 我们写入文件的所有行都会添加到文件末尾。

  • 如果该文件尚不存在,Python将为我们"创建一个空文件"。

示例1:将数据追加到现有文件

我们将使用现有的/tmp/someData.txt添加新行,使用open和a,即追加模式。

#!/usr/bin/env python3
filename = '/tmp/someData.txt'
# Open the file in append mode and append the new content in file_object
with open(filename, 'a') as file_object:
    file_object.write("Third line\n")

我们执行此脚本并验证/tmp/someData.txt的内容

# python3 file_operator.py

第三行添加到我们的现有文件中

# cat /tmp/someData.txt
First line
Second line
Third line

追加与写作

如果文件已经包含信息,并且我们以写模式打开它,然后对其进行写操作,则新内容实际上将覆盖(替换)文件中已有的任何内容。不可撤消。因此,如果文件的内容很重要,则要确保不要犯该错误。要将内容添加到文件中,请在添加(a)模式下打开文件,然后使用.write写入文件。