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

1.概述

学习处理文件和保存数据可让我们的程序使用起来更容易:用户将能够选择输入什么样的数据,以及在什么时候输入;用户使用我们的程序做一些工作后,可将程序关闭,以后再接着往下做。学习处理异常可帮助你应对文件不存在的情形,以及处理其他可能导致程序崩溃的问题。这让我们的程序在面对错误的数据时更健壮,不管这些错误数据源自无意的错误,还是源自破坏程序的恶意企图。

2.从文件中读取数据

文本文件可存储的数据量多得难以置信:天气数据、交通数据、社会经济数据、文学作品等。每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。例如,可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示这些内容。

要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

2.1 读取整个文件

要读取文件,需要一个包含几行文本的文件。下面首先创建一个文件,它包含精确到小数点后30位的圆周率值,且在小数点后每10位处换行:

3.1415926535
  8979323846
  2643383279

要动手尝试后续示例,可在编辑器中输入这些数据行,再将文件保存为pi_digits.txt,下面的程序打开并读取这个文件,再将其内容显示到屏幕上:

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
print(contents)

在这个程序中,第一行代码做了大量的工作。我们先来看看函数open()。要以任何方式使用文件,那怕仅仅是打印其内容,都得先打开文件,才能访问它。函数open()接受一个参数:要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。在本例中,当前运行的是file_reader.py,因此Python在file_reader.py所在的目录中查找pi_digits.txt。函数open()返回一个表示文件的对象。在这里,open(‘pi_digits.txt’)返回一个表示文件pi_digits.txt的对象,Python将该对象赋给file_object供以后使用。

关键字with在不再需要访问文件后将其关闭。在这个程序中,注意到我们调用了open(),但没有调用close()。也可以调用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug导致方法close()未执行,文件将不会关闭。这看似微不足道,但未妥善关闭文件可能导致数据丢失或受损。如果在程序中过早调用close(),你会发现需要使用文件时它已关闭(无法访问),这会导致更多的错误。并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。

有了表示pi_digits.txt的文件对象后,使用方法read()(前述程序的第二行)读取这个文件的全部内容,并将其作为一个长长的字符串赋给变量contents。这样,通过打印contents的值,就可将这个文本文件的全部内容显示出来:

3.1415926535
  8979323846
  2643383279

相比于原始文件,该输出唯一不同的地方是末尾多了一个空行。为何会多出这个空行呢?因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在函数调用print()中使用rstrip():

with open('pi_digits.txt') as file_object:
    contents = file_object.read()

print(contents.rstrip())

前面说过,Python方法rstrip()删除字符串末尾的空白。现在,输出与原始文件的内容完全相同:

3.1415926535
  8979323846
  2643383279

2.2 文件路径

将类似于pi_digits.txt的简单文件名传递给函数open()时,Python将在当前执行的文件(即.py程序文件)所在的目录中查找。

根据你组织文件的方式,有时可能要打开不在程序文件所属目录中的文件。例如,你可能将程序文件存储在了文件夹python_work中,而该文件夹中有一个名为text_files的文件夹用于存储程序文件操作的文本文件。虽然文件夹text_files包含在文件夹python_work中,但仅向open()传递位于前者中的文件名称也不可行,因为Python只在文件夹python_work中查找,而不会在其子文件夹text_files中查找。要让Python打开不与程序文件位于同一个目录中的文件,需要提供文件路径,让Python到系统的特定位置去查找。

由于文件夹text_files位于文件夹python_work中,可以使用相对文件路径来打开其中的文件。相对文件路径让Python到指定的位置去查找,而该位置是相对于当前运行的程序所在目录的。例如,可这样编写代码:

with open('text_files/filename.txt') as file_object:

这行代码让Python到文件夹python_work下的文件夹text_files中去查找指定的.txt文件。

注意 显示文件路径时,Windows系统使用反斜杠(\)而不是斜杠(/),但在代码中依然可以使用斜杠。

还可以将文件在计算机中的准确位置告诉Python,这样就不用关心当前运行的程序存储在什么地方了。这称为绝对文件路径。在相对路径行不通时,可使用绝对路径。例如,如果text_files并不在文件夹python_work中,而在文件夹other_files中,则向open()传递路径’text_files/filename.txt’行不通,因为Python只在文件夹python_work中查找该位置。为明确指出希望Python到哪里去查找,需要提供完整的路径。

绝对路径通常比相对路径长,因此将其赋给一个变量,再将该变量传递给open()会有所帮助:

file_path = '/home/ehmatthes/other_files/text_files/_filename_.txt'
with open(file_path) as file_object:

通过使用绝对路径,可读取系统中任何地方的文件。就目前而言,最简单的做法是,要么将数据文件存储在程序文件所在的目录,要么将其存储在程序文件所在目录下的一个文件夹(如text_files)中。

注意 如果在文件路径中直接使用反斜杠,将引发错误,因为反斜杠用于对字符串中的字符进行转义。例如,对于路径"C:\path\to\file.txt",其中的\t将被解读为制表符。如果一定要使用反斜杠,可对路径中的每个反斜杠都进行转义,如"C:\path\to\file.txt"。

猜你喜欢

转载自blog.csdn.net/qq_41600018/article/details/131263753