学习如何处理文件,能让我们快速的分析大量数据,数据分析离不开文件的处理。同时,我们也将学习异常处理,没有不出错误的程序,但是能否优雅的处理这些错误,是考验我们程序健壮性的好还是不好。
1.从文件中读取数据
要读取文件,我们得先有一个文件,这里我们在当前目录下创建一个文件,随便你在那里创建,只要指定正确的路径就行。来看个例子。
1)创建文件pi_digits.txt,内容如下:
3.1415926535
8979988787
9384734544
2)创建file_reader.py,读取文件
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
说明:关键字with
在不再需要访问文件后将其自动关闭。所以在程序中,只调用了open函数,而没有调用close函数。其实也可以调用open函数,再调用close函数,但是这样做有很大的弊端,一是如果程序中途遭遇bug,导致close未能执行,文件将不会关闭。二是如果程序过早执行close导致,使用文件的时候文件却已经关闭。
结论:使用with吧,我们只管open并使用文件,让Python自动在合适的时候关闭。
1.1文件路径
读取文件,一定要指定文件及其路径,像上面的例子,只有文件名,那么Python会在当前路径下查找文件。
注意:显示文件路径时,Windows系统使用反斜杠(),而不是斜杠(/),但在代码中依然使用斜杠。
相对路径:相对于某一路径下的具体路径。
/test/file/pi_digits.txt
绝对路径:就是准确指出文件存在的具体完整路径。
/home/xxx/test/file/pi_digits.txt
就我们编程而言,要门将数据文件存储在当前程序文件所在目录,要么在当前程序文件下创建一个目录存储。
注意:在windows中,使用反斜杠,会引发错误,因为反斜杠用于对字符串中的字符进行转义,例如:"D:\path\test\file.txt"
,其中\t
将会被解读为制表符。如果一定要使用反斜杠,可以对每个反斜杠再转义,如:"D:\\path\\test\\file.txt"
。
1.2逐行读取
读取文件,往往都是逐行读取:可能要在文件中查找特定的信息,或者以某种方式修改文件中的文本。
filename = 'pi_digit.txt';
with open(filename) as file_content:
for line in lines:
print(line)
将文件赋给变量filename,这是使用文件的一种常见做法。Python根据变量名就知道去哪里查找文件。还是使用with关键字来让Python负责妥善的打开的关闭文件。
上述例子可能会出现空白,我们处理空白的函数就可以发挥作用了。
print(line.rstrip())
1.3用列表存储文件内容
当使用with关键字的时候,文件的内容只能在with代码块内可用。如何才能在代码块外面访问文件内容呢?
with open(filename) as file_content:
lines = file_content.readlines()
for line in lines:
print(line.rstrip())
上面这个例子使用readlines()方法读取文件每行内容,然后存储到列表中,这样就可以在with代码块外使用文件内容了。利用for循环遍历列表,打印文件内容。
1.4 使用文件内容
只要利用列表拿到文件内容,那接下来想怎么处理就怎么处理。例如将上面的文件内容包含在一个字符串中,如何搞呢?
filename = 'pi_digit.txt';
with open(filename) as file_content:
lines = file_content.readlines()
temp_str = ''
for line in lines:
temp_str +=line.strip()
print(f"{temp_str[:10]}")
这里利用了temp_str来拼接列表的每行数据并进行去空格,然后还可以截取字符串进行输出。
注意:读取文本文件时,Python都将其解读为字符串,如果读取的是数,就必须使用函数int()或者float将其转换为整数或者浮点数。
2.写入文件
保存数据最简单的方式之一就是写入文件,这样通过文件的方式可以与他人共享数据。
2.1写入空文件
先来看个例子,如何写入空文件。
filename