出来公司实习,第一次接触到比内存还大的数据,读取过程中经常遇到memoryError错误,所以研究了一下Python的大文件读取方式。
我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: .read()
、.readline()
和 .readlines()
。可以通过设置参数来控制读取的长度(字节)。
.read()
一次性读取读取整个文件,将文件存储在一个字符串变量中。当文件接近或者大于内存时会产生memoryError的错误。
.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,应该使用 .readline()。
with open('filepath', 'r', encoding = 'utf-8') as f:
while True:
line = f.readline() # 逐行读取
if not line: # 到 EOF,返回空字符串,则终止循环
break
Operate(line) #对每行数据进行处理
分块读取(实用靠谱)
将文档按块进行读取
def read_in_chunks(filePath, chunk_size=1024*1024):
file_object = open(filePath,'r',encoding='utf-8')
while True:
chunk_data = file_object.read(chunk_size)
if not chunk_data:
break
yield chunk_data
if __name__ == "__main__":
filePath = "C:/Users/Public/Documents/data/user_data.csv"
for chunk in read_in_chunks(filePath):
print(chunk)
# process(chunk) # <do something with chunk>