1.文件
1.1 从文件中读取数据
文本文件中可存储的数据量多的难以置信:天气数据、交通数据、社会经济数据、文学作品等。每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。
要使用文本文件中的信息。首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。
1.1.1 读取整个文件
要读取文件,需要一个包含几行文本的文件。首先假如我们拥有以下文件:
song_digits.txt
8.3254585665
1565649795
1596324785
将文件保存到你要使用的程序目录。
下面的程序打开并读取这个文件,再将其内容显示到屏幕上:
方法一:
with open('song_digits.txt') as f :
contents = f.read( )
print(contents)
方法二:
f = open('song_digits.txt')
contents = f.read( )
print(contents)
f.close
我们拥有两种读取文件的方法,第一种方法与第二种方法的区别是,第一种方法不用执行f.close( )这行代码。
在这两个程序中,第一行代码都做了大量的工作。我们先来看看函数open( )。要以任何方式使用文件——哪怕仅仅是打印其内容,都得先打开文件,这样才能访问他。函数open( )只接受一个参数:要打开的文件名称。python在当前执行的py文件所在的目录中查找指定的文件,或者在open( )函数中写入绝对路径,找到读取文件。函数open( )返回一个表示文件的对象;python将这个对象存储在我们后面将要使用的变量中。
关键字with在不再需要访问文件时将他自动关闭。在这个程序中,注意我们调用了open(),但没有调用close( );你也可以调用open( )和 close( )来打开关闭文件,但这样做时,如果程序存在bug,导致close语句未执行,文件将不会关闭。这看似微不足道,但未妥善关闭文件可能会导致数据丢失或受损。如果在程序中过早的调用close(),你会发现使用文件时他已经关闭,这会导致更多的错误。并非任何情况下都能轻松的确定关闭确定关闭文件的恰当时机,但是通过with结构,我们可以让python确定:你只管打开文件在需要时使用它,python会在合适的时候自动将其关闭。
有了表示song_digits.txt的对象后,我们使用方法read( ),读取文件的全部内容,并将其作为长长的字符串储存在变量contents中,这样通过打印contents这个值就可将这个文本文件的全部内容显示出来。
我们在输出文件时,唯一不同的地方是末尾多了一个空行。位和会多出一个空行?因为read()在到达文件末尾时会返回一个空字符串,而将这个空字符串显示出来就是一个空行,要删除多与的空行我们可以在print语句中使用rstrip( ):
print(contents.rstrip())
这样输出内容就与源是文件内容相同了。
1.1.2 文件路径
我们在执行一个打开一个文件时,如果你只写入了一个文件名,而刚好你要打开的文件不再你要操作的目录中,这样你打开的文件,就不正确。所以我们可以在open( )函数中写入绝对路径,例如linux’或者OS X中:
with open('/home/kiosk/text_file/filename.txt') as f:
或者
file_path = '/home/kiosk/text_file/filename.txt'
with open(file_path) as f:
在Window中使用:
with open('C:\Users\ehmatthes\other_files\text_file\filename.txt') as f:
或者
file_path = 'C:\Users\ehmatthes\other_files\text_file\filename.txt'
with open(file_path) as f:
1.1.3 逐行读取
读取文件时,常常需要检查其中的每一行。要以每次以行的方式检查文件,可对文件对象使用for循环:
file_read.py
filename = 'song_digits.txt'
with open(filename) as f:
for line in f:
print(line)
这时候我们发现打印每一行的时,发现空白行更多了,这是因为在每一行的末尾都有一个看不见的换行符,而print语句也会加哈桑一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print语句。要消除这些多与的空白行,可在语句中使用rstrip():
filename = 'song_digits.txt'
with open(filename) as f:
for line in f:
print(