Python入门(二十三)文件(二)

1.文件读取

1.1 逐行读取

读取文件时,常常需要检查其中的每一行:可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。例如,你可能要遍历一个包含天气数据的文件,并使用天气描述中包含sunny字样的行。在新闻报道中,你可能会查找包含标签的行,并按特定的格式设置它。

要以每次一行的方式检查文件,可对文件对象使用for循环:

❶ filename = 'pi_digits.txt'with open(filename) as file_object:for line in file_object:
          print(line)

在❶处,将要读取的文件的名称赋给变量filename。这是使用文件时的一种常见做法。变量filename表示的并非实际文件——它只是一个让Python知道到哪里去查找文件的字符串,因此可以轻松地将’pi_digits.txt’替换为要使用的另一个文件的名称。调用open()后,将一个表示文件及其内容的对象赋给了变量file_object(见❷)。这里也使用了关键字with,让Python负责妥善地打开和关闭文件。为查看文件的内容,通过对文件对象执行循环来遍历文件中的每一行(见❸)。

打印每一行时,发现空白行更多了:

3.1415926535

  8979323846

  2643383279

为何会出现这些空白行呢?因为在这个文件中,每行的末尾都有一个看不见的换行符,而函数调用print()也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自函数调用print()。要消除这些多余的空白行,可在函数调用print()中使用rstrip():

filename = 'pi_digits.txt'

with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip())

现在,输出又与文件内容完全相同了:

3.1415926535
  8979323846
  2643383279

1.2 创建一个包含文件各行内容的列表

使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表:可以立即处理文件的各个部分,也可以推迟到程序后面再处理。

下面的示例在with代码块中将文件pi_digits.txt的各行存储在一个列表中,再在with代码块外打印:

  filename = 'pi_digits.txt'

  with open(filename) as file_object:
❶     lines = file_object.readlines()for line in lines:
      print(line.rstrip())

❶处的方法readlines()从文件中读取每一行,并将其存储在一个列表中。接下来,该列表被赋给变量lines。在with代码块外,依然可使用这个变量。在❷处,使用一个简单的for循环来打印lines中的各行。因为列表lines的每个元素都对应于文件中的一行,所以输出与文件内容完全一致。

1.3 使用文件的内容

将文件读取到内存中后,就能以任何方式使用这些数据了。下面以简单的方式使用圆周率的值。首先,创建一个字符串,它包含文件中存储的所有数字,且没有任何空格:

filename = 'pi_digits.txt'

  with open(filename) as file_object:
      lines = file_object.readlines()

❶ pi_string = ''for line in lines:
      pi_string += line.rstrip()print(pi_string)
  print(len(pi_string))

像前一个示例一样,首先打开文件,并将其中所有的行都存储在一个列表中。在❶处,创建了一个变量pi_string,用于指向圆周率的值。接下来,使用一个循环将各行加入pi_string,并删除每行末尾的换行符(见❷)。在❸处,打印这个字符串及其长度:

3.1415926535  8979323846  2643383279
36

变量pi_string指向的字符串包含原来位于每行左边的空格,为删除这些空格,可使用strip()而非rstrip():

--snip--
for line in lines:
    pi_string += line.strip()

print(pi_string)
print(len(pi_string))

这样就获得了一个字符串,其中包含准确到30位小数的圆周率值。这个字符串长32字符,因为它还包含整数部分的3和小数点:

3.141592653589793238462643383279
32

注意 读取文本文件时,Python将其中的所有文本都解读为字符串。如果读取的是数,并要将其作为数值使用,就必须使用函数int()将其转换为整数或使用函数float()将其转换为浮点数。

2.写入文件

保存数据的最简单的方式之一是将其写入文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:可以在程序结束运行后查看这些输出,可以与别人分享输出文件,还可以编写程序来将这些输出读取到内存中并进行处理。

2.1 写入空文件

要将文本写入文件,你在调用open()时需要提供另一个实参,告诉Python你要写入打开的文件。为明白其中的工作原理,我们来将一条简单的消息存储到文件中,而不是将其打印到屏幕上:

  filename = 'programming.txt'with open(filename, 'w') as file_object:
❷     file_object.write("I love programming.")

在本例中,调用open()时提供了两个实参(见❶)。第一个实参也是要打开的文件的名称。第二个实参(‘w’)告诉Python,要以写入模式打开这个文件。打开文件时,可指定读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)或读写模式(‘r+’)。如果省略了模式实参,Python将以默认的只读模式打开文件。

如果要写入的文件不存在,函数open()将自动创建它。然而,以写入模式(‘w’)打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件的内容。

在❷处,使用文件对象的方法write()将一个字符串写入文件。这个程序没有终端输出,但如果打开文件programming.txt,将看到其中包含如下一行内容:

I love programming.

相比于计算机中的其他文件,这个文件没有什么不同。你可以打开它、在其中输入新文本、复制其内容、将内容粘贴到其中,等等。

注意 Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。

2.2 写入多行

函数write()不会在写入的文本末尾添加换行符,因此如果写入多行时没有指定换行符,文件看起来可能不是你希望的那样:

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")
    file_object.write("I love creating new games.")

如果你打开programming.txt,将发现两行内容挤在一起:

I love programming.I love creating new games.

要让每个字符串都单独占一行,需要在方法调用write()中包含换行符:

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love creating new games.\n")

现在,输出出现在不同的行中:

I love programming.
I love creating new games.

像显示到终端的输出一样,还可以使用空格、制表符和空行来设置这些输出的格式。

2.3 附加到文件

如果要给文件添加内容,而不是覆盖原有的内容,可以以附加模式打开文件。以附加模式打开文件时,Python不会在返回文件对象前清空文件的内容,而是将写入文件的行添加到文件末尾。如果指定的文件不存在,Python将为你创建一个空文件。

下面来修改write_message.py,在既有文件programming.txt中再添加一些你酷爱编程的原因:

  filename = 'programming.txt'with open(filename, 'a') as file_object:
❷     file_object.write("I also love finding meaning in large datasets.\n")
      file_object.write("I love creating apps that can run in a browser.\n")

在❶处,打开文件时指定了实参’a’,以便将内容附加到文件末尾,而不是覆盖文件原来的内容。在❷处,又写入了两行,它们被添加到文件programming.txt末尾:

I love programming.
I love creating new games.
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.

最终的结果是,文件原来的内容还在,后面则是刚添加的内容。

posted @ 2023-06-17 19:53  小幽余生不加糖  阅读(6)  评论(0编辑  收藏  举报  来源