对文件内容进行迭代

#前面了解了文件的基本操作方法。在实际应用中,对文件内容进行迭代和重复执行操作是比较常见的操作。
#所谓迭代,是指不断重复某一个动作,直到这些动作都完成为止。
 
1、按字节处理
#在while循环中,read方法是最常见的对文件内容进行迭代的方法,例如:
 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #file_while
 4 
 5 path='./test.txt'
 6 f_name=open(path,'w')
 7 print('write length:',f_name.write('Hello'))
 8 f_name=open(path)
 9 c_str=f_name.read(1)
10 while c_str:
11     print('read str is:',c_str)
12     c_str=f_name.read(1)
13 f_name.close()
#执行结果如下:
1 D:\Python\workspace\datatime\20180116>python file_while.py
2 write length: 5
3 read str is: H
4 read str is: e
5 read str is: l
6 read str is: l
7 read str is: o
#由执行结果看到,该示例对写入文件的每个字符都进行了循环了。这个程序运行到文件末尾时,read方法会返回一个空字符串,未执行到空字符串前,返回的都是非空字符串,表示布尔值为真。
#该示例中出现了代码的重复使用,可以使用while true/break语句结构进一步优化。优化代码如下:
 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #file_while
 4 
 5 path='./test.txt'
 6 
 7 f_name=open(path)
 8 while True:
 9     c_str=f_name.read(1)
10     if not c_str:
11         break
12     print('read str is:',c_str)
13 f_name.close()
#由代码结构看到,更改后的代码比之前更好。
2、按行操作
#在实际操作中,处理文件时可能需要对文件的行进行迭代,而不是单个字符。此时可以使用和处理字符一样的方式,只不过要使用readline方法,例如:
 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #迭代_readline
 4 
 5 path='./test.txt'
 6 
 7 f_name=open(path)
 8 while True:
 9     line=f_name.readline(1)
10     if not line:
11         break
12     print('read line is:',line)
13 f_name.close()
#使用该方式得到的是按行读取的字符。
 
3、使用fileinput实现懒加载式迭代
#我们前面了解了read方法和readline方法,这两个方法不带参数时将度组文件中所有内容,然后加载到内存中。当文件很大时,使用这个方式会占用太多内存,甚至直接使内存溢出(内存不够),从而导致执行失败。这种情况下,我们可以考虑使用while循环和readline方法代替这些方法。
#在Python中,for循环是优先考虑的选择,使用for循环意味着可以对任何进行分隔操作,而不是一步到位。
#按行读取时,若能使用for循环,则称之为懒加载式迭代,因为在操作过程中只读取实际需要的文件部分。使用fileinput需要导入fileinput模块,例如:
1 #!/usr/bin/python3
2 #-*-condig:UTF-8-*-
3 #fileinput
4 
5 import fileinput
6 for line in fileinput.input(path):
7     print('line is',line)
#在该示例中没有看到文件的打开和关闭操作,是怎么处理文件的呢?其实这些操作被封装在input方法内部了。
 
4、文件迭代器
#从Python2.2版本开始,文件对象是可迭代的,这意味着可以直接在for循环中使用文件对象,从而进行迭代,例如:
 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #文件迭代器
 4 
 5 path='./test.txt'
 6 
 7 f_name=open(path)
 8 for line in f_name:
 9     print('line is:',line)
10 f_name.close()
#该示例使用for循环对文件对象进行迭代,记住迭代结束后的文件要显式关闭。
posted @ 2018-01-28 08:38  爱你无目的  阅读(1038)  评论(0编辑  收藏  举报