14_Python编程从入门到实践_文件

一,使用文本内容

至此,你掌握了编写组织有序而易于使用的程序所需的基本技能,该考虑让程序目标更明确、用途更大了。在本章中,你将学习处理文件,让程序能够快速地分析大量的数据;你将学习错误处理,避免程序在面对意外情形时崩溃;你将学习异常 ,它们是Python创建的特殊对象,用于管理程序运行时出现的错误;你还将学习模块json ,它让你能够保存用户数据,以免在程序停止运行后丢失。
学习处理文件和保存数据可让你的程序使用起来更容易:用户将能够选择输入什么样的数据,以及在什么时候输入;用户使用你的程序做一些工作后,可将程序关闭,以后再接着往下做。学习处理异常可帮助你应对文件不存在的情形,以及处理其他可能导致程序崩溃的问题。这让你的程序在面对错误的数据时更健壮——不管这些错误数据源自无意的错误,还是源自破坏程序的恶意企图。你在本章学习的技能可提高程序的适用性、可用性和稳定性

1)从文件中读取数据:

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

EG:

14_Python编程从入门到实践_文件
14_Python编程从入门到实践_文件
1)函数open()接受一个参数,要打开文件的名称,返回一个表示文件pi_digits.txt的对象,Python将对象存储在后面使用的变量中
2)关键字with在不再需要访问文件后将其关闭。在这个程序中,注意到我们调用了open() ,但没有调用close() ;你也可以调用open() 和close() 来打开和关闭文件,但这样做时,如果程序存在bug,导致close() 语句未执行,文件将不会关闭。这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损。如果在程序中过早地调用close() ,你会发现需要使用文件时它已关闭 (无法访问),这会导致更多的错误。并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭
3)有了表示pi_digits.txt的文件对象后,我们使用方法read() (前述程序的第2行)读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量contents 中。这样,通过
打印contents 的值,就可将这个文本文件的全部内容显示出来
4)相比于原始文件,该输出唯一不同的地方是末尾多了一个空行。为何会多出这个空行呢?因为read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一
个空行。要删除多出来的空行,可在print 语句中使用rstrip() :Python方法rstrip() 删除(剥除)字符串末尾的空白。现在,输出与原始文件的内容完全相同

2)文件路径

相对路径:,而该位置是相对于当前运行的程序所在目录的。在Linux和OS X中,你可以这样编写代码:
with open(‘text_files/filename.txt’) as file_object:
在Windows系统中,在文件路径中使用反斜杠(\ )而不是斜杠(/ ):
with open(‘text_files\filename.txt’) as file_object:

绝对路径:
在Linux和OS X中:
file_path = '/home/ehmatthes/other_files/text_files/filename.txt’
with open(file_path) as file_object:
Windows系统中:
file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt’
with open(file_path) as file_object:

3)逐行读取

使用for循环
14_Python编程从入门到实践_文件
在❶处,我们将要读取的文件的名称存储在变量filename 中,这是使用文件时一种常见的做法。由于变量filename 表示的并非实际文件——它只是一个让Python知道到哪里去查找文件的字符串,因此可轻松地将’pi_digits.txt’ 替换为你要使用的另一个文件的名称。调用open() 后,将一个表示文件及其内容的对象存储到了变量file_object 中(见❷)。这里也使用了关键字with ,让Python负责妥善地打开和关闭文件。为查看文件的内容,我们通过对文件对象执行循环来遍历文件中的每一行(见
❸)。
我们打印每一行时,发现空白行更多了:
14_Python编程从入门到实践_文件
为何会出现这些空白行呢?因为在这个文件中,每行的末尾都有一个看不见的换行符,而print 语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print 语句。要消除这些多余的空白行,可在print 语句中使用rstrip() :
14_Python编程从入门到实践_文件

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

使用关键字with 时,open() 返回的文件对象只在with 代码块内可用。如果要在with 代码块外访问文件的内容,可在with 代码块内将文件的各行存储在一个列表中,并在with 代码块外使用该列表:你可以立即处理文件的各个部分,也可推迟到程序后面再处理。
下面的示例在with 代码块中将文件pi_digits.txt的各行存储在一个列表中,再在with 代码块外打印它们:
14_Python编程从入门到实践_文件
❶处的方法readlines() 从文件中读取每一行,并将其存储在一个列表中;接下来,该列表被存储到变量lines 中;在with 代码块外,我们依然可以使用这个变量。在❷处,我们使用一个简单的for 循环来打印lines 中的各行。由于列表lines 的每个元素都对应于文件中的一行,因此输出与文件内容完全一致。

1,使用文件的内容

将文件读取到内存中后,就可以以任何方式使用这些数据了。下面以简单的方式使用圆周率的值。首先,我们将创建一个字符串,它包含文件中存储的所有数字,且没有任何空格:
14_Python编程从入门到实践_文件
就像前一个示例一样,我们首先打开文件,并将其中的所有行都存储在一个列表中。在❶处,我们创建了一个变量——pi_string ,用于存储圆周率的值。接下来,我们使用一个循环将各行都加入pi_string ,并删除每行末尾的换行符(见❷)。在❸处,我们打印这个字符串及其长度:
14_Python编程从入门到实践_文件
在变量pi_string 存储的字符串中,包含原来位于每行左边的空格,为删除这些空格,可使用strip() 而不是rstrip() :
14_Python编程从入门到实践_文件
这样,我们就获得了一个这样的字符串:它包含精确到30位小数的圆周率值。这个字符串长32字符,因为它还包含整数部分的3和小数点:
14_Python编程从入门到实践_文件
注意: 读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并要将其作为数值使用,就必须使用函数int() 将其转换为整数,或使用函数float() 将其转换为浮点数

2,包含一百万位的大型文件

前面我们分析的都是一个只有三行的文本文件,但这些代码示例也可处理大得多的文件。如果我们有一个文本文件,其中包含精确到小数点后1 000 000位而不是30位的圆周率值,也可创建一个包含所有这些数字的字符串。为此,我们无需对前面的程序做任何修改,只需将这个文件传递给它即可。在这里,我们只打印到小数点后50位,以免终端为显示全部1 000 000位而不断地翻滚:
14_Python编程从入门到实践_文件

3,圆周率值中包含你的生日吗

14_Python编程从入门到实践_文件

二,写入文件

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

1)写入空文件:

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

2)写入多行

14_Python编程从入门到实践_文件

3)附加到文件

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