最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法。

我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: .read().readline().readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。下面是read()方法示例:

Python
try: f = open('/path/to/file', 'r') print f.read() finally: if f: f.close()
1
2
3
4
5
6
7

try:
f = open('/path/to/file', 'r')
print f.read()
finally:
if f:
f.close()

  调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。
  如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

Python
for line in f.readlines(): process(line) # <do something with line>
1
2
3

for line in f.readlines():
process(line) # <do something with line>

Read In Chunks

  处理大文件是很容易想到的就是将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。这里用了 iter & yield

Python
def read_in_chunks(filePath, chunk_size=1024*1024): """ Lazy function (generator) to read a file piece by piece. Default chunk size: 1M You can set your own chunk size """ file_object = open(filePath) while True: chunk_data = file_object.read(chunk_size) if not chunk_data: break yield chunk_data if __name__ == "__main__": filePath = './path/filename' for chunk in read_in_chunks(filePath): process(chunk) # <do something with chunk>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

def read_in_chunks(filePath, chunk_size=1024*1024):
"""
Lazy function (generator) to read a file piece by piece.
Default chunk size: 1M
You can set your own chunk size
"""
file_object = open(filePath)
while True:
chunk_data = file_object.read(chunk_size)
if not chunk_data:
break
yield chunk_data
if __name__ == "__main__":
filePath = './path/filename'
for chunk in read_in_chunks(filePath):
process(chunk) # <do something with chunk>

Using with open()

  with语句打开和关闭文件,包括抛出一个内部块异常。for line in f文件对象f视为一个迭代器,会自动的采用缓冲IO和内存管理,所以你不必担心大文件。

Python
#If the file is line based with open(...) as f: for line in f: process(line) # <do something with line>
1
2
3
4
5

#If the file is line based
with open(...) as f:
for line in f:
process(line) # <do something with line>

Conclusion

  在使用python进行大文件读取时,应该让系统来处理,使用最简单的方式,交给解释器,就管好自己的工作就行了。

  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱

python读取超大文件 Python读取大文件(GB)相关推荐

  1. html大文件传输,socket大文件传输

    遇到了在c#中socket如何实现大文件传输 接收端 private void Receive(Socket socket) { NetworkStream ns = new NetworkStrea ...

  2. 如何快速传输大文件,介绍大文件快速方法

    现在,企业比以往任何时候都面临着一个重大挑战:需要一个快速共享文件的解决方案.但是,并非所有快速文件传输解决方案都以相同的速度传输文件.文件大小.端点位置.路径.设备.防火墙.网络系统和加密需求都会限 ...

  3. Linux_Shell脚本 + 配置文件:按照不同文件类型合并文件,小文件合并成大文件

    需求概述 某项业务中,我方通过文件接口与上游系统进行数据交互,上游系统通过ftp的方式推送接口数据文件到指定目录,我方通过sqlldr的方式入库并处理接口数据. 为保证接口数据的一致性,我方每天会将前 ...

  4. Git objects文件夹下大文件清理

    Git objects文件夹下大文件清理 最近遇到git上工程突然变得很大,原因是.git/objects/pack 文件过大,之前上传过大文件,文件虽然删除,但是记录还在,在此先记录一下. # 例如 ...

  5. hive与spark合并小文件,将大文件打碎成小文件

    场景一:将小文件合并成大文件. mro_hour_test表每个分区有几千个1m未压缩小文件, 以下语句是将几千个文件在输入时(map阶段)合并成150M一个的文件,插入到mro_hour_test_ ...

  6. python读取.tsv文件例子(大文件处理)

    本文介绍如何用python读取.tsv文件. 目录 1..tsv 文件介绍 2..tsv 文件读取 1..tsv 文件介绍 TSV(Tab-separated values)文件是一种文本文件格式,它 ...

  7. python处理大文件_Python如何处理大文件(知识整理)

    数据量非常大时,比如一份银行一个月的流水账单,可能有高达几千万的record.对于一般性能的计算机,有或者是读入到特殊的数据结构中,内存的存储可能就非常吃力了.考虑到我们使用数据的实际情况,并不需要将 ...

  8. 用python的xlsxwriter库写EXCEL大文件时,内存占用过高

    用python的xlsxwriter库创建较大的Excel文件时,会占用过高的内存.很容易导致程序异常结束. 设置constant_memory属性后,就可以避免这个问题. 例: workbook = ...

  9. python文件下载不全_python requests 下载大文件不完整

    目前我有一个脚本, 从帝联的 CDN 外链获取一下文件作为备份. 使用的是 Python 2.7.10 requests 2.8.1 目前碰到一个情况, 使用 requests 下载大文件的时候会出现 ...

  10. php大文件读取和存储,php存储大文件思路

    这个似乎是没办法. 看这段: 在图片上传部分,其实能玩的花样很少,但是编写代码所消耗的时间最多.现在我们再假设一种情景,如果我们的图片服务器前端采用Nginx,上传功能 用PHP实现,需要写的代码很少 ...

最新文章

  1. 006-spring cache-缓存实现-01-原生实现
  2. 吴恩达课程翻译_中文学习资源:斯坦福大学CS231n计算机视觉课程
  3. 苏宁易购:Hadoop失宠前提是出现更强替代品
  4. 设计模式之Builder (创建者模式)的一些个人理解(转)
  5. LeetCode 1253. 重构 2 行二进制矩阵(贪心)
  6. 短信计费(信息学奥赛一本通-T1398)
  7. Redis:复制,第1部分——概述 复制与分片、哨兵与集群、Redis拓扑
  8. 19-random猜数
  9. velocity 变量 获取_velocity 怎么得到项目根路径
  10. Lwip协议netif结构体详解
  11. pillow生成企业营业执照
  12. php商店管理系统,基于PHP的商店管理系统.doc
  13. 基于CC2430的Zigbee的第一个实验
  14. 异地电脑如何共享文件?
  15. 8种bootstrap团队会员头像样式代码
  16. 【unity 保卫星城】--- 开发笔记(Demo演示篇)
  17. iOS UILable换行相关设置
  18. 佐治亚理工学院计算机科学硕士,佐治亚理工学院
  19. 高二学业水平测试计算机考试时间,2019高中学业水平考试时间 普通高中学业水平什么时候考试...
  20. FFmpeg av_frame_free崩溃可能原因

热门文章

  1. FMEA软件——什么时候启动FMEA?
  2. python matplotlib输出矢量图svg(可插入word,仍为高清)
  3. Vscode+MobaXterm跨平台开发
  4. 壳聚糖基原位水凝胶包载角膜缘干细胞/纳米壳聚糖骨形态发生蛋白水凝胶的研究制备
  5. docker之部署mall开源项目
  6. 计算机管理声音视屏不见,为什么视频没声音_电脑看视频没声音怎么恢复-win7之家...
  7. (ssl1232)雷达覆盖(normal)
  8. HTML转pdf几种解决方案,java开发html转pdf 解决方案
  9. Minitab 21 功能列表
  10. 因特网的服务器协议,因特网信息访问协议