阅读《Python编程从入门到实践》Day12

第十章(一)

异常是Python创建的特殊对象,用于管理程序运行时出现的错误。模块json,能够保存用户数据,以免在程序停止运行后丢失。

1、从文件中读取数据

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

(1)读取整个文件

要读取文件,需要一个包含几行文本的文件。下面创建一个包含小数点后30为的圆周率值,且每10位换行,名为pi_digits.txt的文件:

3.1415926535
  8979323846
  2643383279

打开并读取这个文件,再将其内容显示在屏幕上:

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents)
# 输出:
3.1415926535
  8979323846
  2643383279

要使用文件,必须先打开文件,这样才能访问它。函数open()接受一个参数:要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。函数open()返回一个表示文件的对象。在这里,返回一个表示文件pi_digits.txt的对象;Python将这个对象存储在我们将在后面使用的变量中。
关键字with在不需要访问文件后将自动将关闭文件。显然,你也可以用open()和close()来打开和关闭文件,但是一旦程序出错,导致close()语句没执行,文件将不会关闭。未妥善地关闭文件可能会导致数据丢失或受损。相反,如果过早地调用了close(),当你需要使用文件时,文件已经关闭,会导致程序出错。所以在不确定该何时关闭文件的时候,最好使用前面所示的结构,让Python去确定:你只管打开和使用文件,Python会在合适的时候自动关闭文件。
有了文件对象后,用方法read()来读取这个文件的全部内容。书中提到输出的内容后面多了一个空行,是因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除末尾的空行,可在print()语句中使用rstrip(),该方法删除字符串末尾的空白。

(2)文件路径

执行open()函数时,Python将在当前执行的文件所在的目录中查找需要打开的文件。
根据你组织文件的方式,有时候可能要打开不在程序文件所属目录中的文件。要让Python你打开不与程序文件位于同一个目录中的文件,需要提供文件路径,它让Python到系统的特定位置去查找。
若文件夹text_files与执行文件位于同一个目录下,而需要打开的文件位于该文件夹内,可使用相对文件路径来打开该文件夹中的文件。相对文件路径让Python到指定的位置去查找,而该位置是相对于当前运行的程序所在目录的。即:

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

上面这条语句中的r是用于保留原始字符,避免路径中的(\)对程序造成不必要的影响(因为反斜杠在Python中被视为转义字符)。另外,这条语句是在Windows系统中使用,而在Linux和OS X中,(\)要改为(/)。
你可以将需要打开的文件在计算机中的准确位置告诉Python,这时无论执行文件存储在什么地方,都可以准确打开文件。这就是绝对文件路径。在相对路径行不通时,可使用绝对路径。绝对路径通常比相对路径更长,因此将其存储在一个变量中,在将该变量传递给open()会有所帮助。在Windows系统中,绝对路径类似于:

file_path = r'C:\Users\ehmatthes\other_files\text_files\filename.txt'
with open(file_path) as file_object:

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

(3)逐行读取

读取文件时,常常需要检查其中的每一行,要以每次一行的方式检查文件,可对文件对象使用for循环:

filename = 'pi_digits.txt'
with open(filename) as file_object:
    for line in file_object:
        print(line)
# 输出:
3.1415926535
  8979323846
  2643383279
(4)创建一个包含文件各行内容的列表

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

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

for line in lines:
    print(line.rstrip())
# 输出:
3.1415926535
  8979323846
  2643383279

readlines()方法从文件中读取每一行,并将其存储在一个列表中,该列表被存储在标量lines中,在代码块外,依然可以使用这个变量。由于列表lines的每个元素都对应于文件中的一行,因此输出与文件内容完全一致。

(5)使用文件的内容

将文件读取到内存中后,就可以以任何方式使用这些数据了。下面以简单的方式使用圆周率的值:

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

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

print(pi_string)
print(len(pi_string))
# 输出:
3.141592653589793238462643383279
32

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

(6)包含一百万位的大型文件

如果我们的文件中包含的圆周率值时精确到小数点后1000000位的而不仅仅是30位的,我们也可以创建一个包含所有这些数字的字符串。对于这些情况,我们无需对前面的程序做任何的修改,只需将这个文件传递给它就可以了。
对于你可处理的数据量,Python没有任何的限制;只要系统的内存足够多,你想处理多少数据都可以。
注意:这个一百万位的圆周率文件pi_million_digits.txt,需要从ituring.cn/book/1861下载相关的资源。

(7)圆周率值中包含你的生日吗

对于这个问题,我们可以提示用户输入其生日,然后通过Python检查这个字符串是否包含在从文件读取到的圆周率字符串中。
读取文件的内容后,就可以以你能想到的任何方式对其进行分析。

你可能感兴趣的:(阅读《Python编程从入门到实践》Day12)