首页 > 代码库 > 文件和异常(一)

文件和异常(一)

通过处理文件,可以让程序快速的分析大量的数据;

 

1,从文件中读取数据

#!/usr/bin/env python

#filename = read_pi.py

with open(‘pi.txt‘) as file_object:

    contents = file_object.read()

    print(contents)

这段代码的核心在第一行:

   1,函数open() 打开文件

          对文件做任何操作的之前,首先必须打开文件

          在open()函数中指定文件名代表在当前目录寻找此文件,如果当前目录没有次文件会报错

[root@Python-Test Alben-PY]# mv pi.txt pi_10.txt
[root@Python-Test Alben-PY]# ./read_pi.py
Traceback (most recent call last):
File "./read_pi.py", line 4, in <module>
with open(‘pi.txt‘) as file_object:
FileNotFoundError: [Errno 2] No such file or directory: ‘pi.txt‘

   2,关键字 “with”

         函数open()的对应函数close()是指关闭文件,如果这样调用的话,在程序运行过程中如果遇到bug,导致close()未执行,

         导致文件不会关闭。未妥地关闭文件可能导致数据丢失或者受损。如果在程序中过早的调用close(),则可能导致需要再次

         使用文件时,文件已经关闭。

         使用“with”让python自动判断何时需要关闭文件。

 第二行,对打开的文件使用read()函数,读取的内容存放在变量 contents中。

读取的效果:

[root@Python-Test Alben-PY]# ./read_pi.py
3.141592
65358979
32384626
43383279

[root@Python-Test Alben-PY]#

源文件:

[root@Python-Test Alben-PY]# cat pi.txt
3.141592
65358979
32384626
43383279
[root@Python-Test Alben-PY]#

可以发现末尾多了一行空行!

why?
 因为read()到达文件尾部后会返回一个空字串,而将这个空字符串显示出来就是一个空行。

如何删除:

with open(‘pi.txt‘) as file_object:
contents = file_object.read()
print(contents.rstrip())

效果:

 

[root@Python-Test Alben-PY]# ./read_pi.py
3.141592
65358979
32384626
43383279
[root@Python-Test Alben-PY]#

 

2、文件路径

读取文件的时候,如果文件不在当前目录下,需要制定路径

例如:

在/tmp下有一个文件,test1.txt

 

[root@Python-Test Alben-PY]# cat /tmp/test1.txt
this is test file
please read thie file with python!

如何读取此文件——

#!/usr/bin/env python

#filename = tmp_file.py

 

with open(‘/tmp/test1.txt‘) as file_object:

    file_content = file_object.read()

    print(file_content.rstrip())

 

这里的文件路径,可以用绝对路径,也可以用相对路径(linux文件路径基础有解释绝对与相对)

note:如果是windows的话,目录分隔符是“\”。

 

3、逐行读取:

需要查找文件特定内容的时候,就需要一行一行遍历文件,对文件逐行读取需要使用for循环

例如,逐行读取/etc/passwd文件

#!/usr/bin/env python

#filename etc_passwd.py  

filename = ‘/etc/passwd‘   把文件路径定义到变量 filename

with open(filename) as file_object:

    for line in file_object:    对打开的文件进行for循环

        print(line)

        if ‘halt‘ in line:        当读取到的行中含有字符“halt”时,

            break                  中断循环

效果:

[root@Python-Test Alben-PY]# ./etc_passwd.py
root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

[root@Python-Test Alben-PY]#

也会带有很多空格,使用相同的方法进行去除空格:

with open(filename) as file_object:

    for line in file_object:

        print(line.rstrip())

        if ‘halt‘ in line:

            break

 

4、读取内容到列表

使用‘with’时,open()返回的文件对象旨在with代码内可用,如果需要在with代码块外访问文件的内容,

可在with代码块内讲文件的各行储存在一个列表中。

例如:

with open(‘pi.txt‘) as file_object:

    pi_list = file_object.readlines()

   

print(pi_list)

[root@Python-Test Alben-PY]# ./list_pi.py
[‘3.141592\n‘, ‘65358979\n‘, ‘32384626\n‘, ‘43383279\n‘]

解读:

因为readlines()读取文件的时候把文件夹末尾的换行符也读取进来了,所以生成的表格会带有\n。

 

处理这个列表:

pi_string = ‘‘

for line in pi_list:

    pi_string += line.rstrip()

print(pi_string)

print(len(pi_string))

在第一行,我们定义了一个空字符串 pi_string

第二行使用for循环遍历这个列表,

第三行把每一行去除结尾换行符后的内容添加到变量pi_string中

最后打印变量 pi_string,同时计算len

 

文件和异常(一)