#前面了解了文件的基本操作方法。在实际应用中,对文件内容进行迭代和重复执行操作是比较常见的操作。
#所谓迭代,是指不断重复某一个动作,直到这些动作都完成为止。
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循环对文件对象进行迭代,记住迭代结束后的文件要显式关闭。