问题描述
文件扫描,想必大家都很清楚这个概念,就是读取外部文件(比如存储在硬盘上的数据),至内存(计算机主存)中,这是一个输入流的概念。现在我想就这个问题展开叙述一下
分析问题
关键字
文件,输入流,二进制文件,文本文件,缓冲区,块,行,字符,文件迭代器,循环
简短描述
大家可能会问,为什么要读取文件数据呢?其实有些时候,一些数据保存在硬盘上,但是CPU不能直接与硬盘交互,所说必须先将数据读取到内存中,在通过程序中的代码逻辑处理这些数据,之后可以选择打印或者再次输出到硬盘中。
那么针对输入流而言
- 首先我想到的是该怎么编程实现呢?
- 哦,我们可以使用循环来处理文件。
- 使用循环处理时,该采用哪种循环呢?
- while or for 循环都可以,但是二者编程实现时会有细微差别。
- 二进制数据文件,例如图片视频之类的,与文本数据该怎么分别处理呢?
- 二进制数据建议采用while循环进行处理,并且按块读入,加速处理速度;
- 文本数据建议采用for循环进行处理,并且使用文件迭代器,当文件较大,并且内存羞涩时,可以加速处理速度。
代码示例
以下代码基于Python3,可能不适用于Python2
- 文件内容一次加载至字符串,可以调用read:
file = open('test.txt', 'r')
print(file.read()) #文件一次读入到一个字符串中,并打印显示
使用while循环,分块加载文件,并且手动判断是否读到文件末尾,从而break退出循环
块为1个字节大小:
file = open('test.txt') #使用默认的'r'模式 while True: char = file.read(1) #缓冲区为1个字节大小,即一次读取一个字符 if not char: break #若读取到的字符对象为空,则文件已读取完毕,跳出循环 print(char)
块为10个字节大小
file = open('test.txt') #使用默认的'r'模式 while True: chunk = file.read(10) #缓冲区为10个字节大小 if not chunk: break #若读取到的字符串为空,则文件已读取完毕,跳出循环 print(chunk)
块为一行大小
file = open('test.txt') #使用默认的'r'模式 while True: line = file.readline() #一次读取一行 if not line: break #若读取到的字符串为空,则文件已读取完毕,跳出循环 print(line, end='') #line已经有了一个换行符,故此处抑制print的隐式换行
使用for循环逐个字符处理
for char in open('test.txt').read(): print(char)
使用for循环,逐行读取文本,这是最方便的!
不适用迭代器,一次读取所有行,吃内存,大文本不推荐!
for line in open('test.txt').readlines(): print(line, end='')
使用文件迭代器,自动在每次循环迭代时读取一行,推荐,最佳选择!
for line in open('test.txt'): print(line, end='')
自我总结
文件扫描是一个很重要的方法,推荐使用最后一种,但是其他的也要熟练掌握!