python 如何读取大文件
一般的读取文件的方法:
with open(file_path, "r") as f:
print f.read()
或者
with open(file_path,"r") as f:
for line in f.readlines():
print line
read()是一次性把文件内容以字符串的方式读到内存,放到一个字符串变量中
readlines() 是一次性读取所有内容,并按行生成一个list
因一次性读取,若文件内容过大,则会将内存爆掉。报错:“MemoryError”
读取大几G的大文件,可以利用生成器 generator
方法一: 将文件切分成小段,每次处理完小段,释放内存
def read_in_block(file_path):
BLOCK_SIZE=1024
with open(file_path,"r") as f:
while True:
block =f.read(BLOCK_SIZE) #每次读取固定长度到内存缓冲区
if block:
yield block
else:
return #如果读取到文件末尾,则退出
for block in read_in_block(file_path):
print block
// 这个方法,速度很快(只有3s),但有个问题,若满足了1024时,会将正好在1024位置的数据切开,如下
cad1a596-fe14-45c4-b920-8bc0eab38ee6
c6f0c5bf-4359-4a28-9f90-3c4f61b5e12d
3815cd95-2147-4701-8d50-273325140643
c047d057-c33d-4a69-995a-5
29cb5cb04ee
afd9cffb-09f0-4347-bf12-34485969b366
3c145a79-c72c-43db-8e68-02be8046c6b4
虽然每个block都是str, 但无法直接得到每行的id,只能再切分。
方法二 利用open("","")系统自带方法生成的迭代对象
with open(file_path) as f:
for line in f:
print line
for line in f 这种用法是把文件对象f当作迭代对象,系统将自动处理IO缓存和内存管理。
耗时较第1种方法慢一点,要25s。 但每个Line, type都是str, 都是自己需要的一行数据(一行是一个id)。
>>> f = open("dup_file - Copy (2).txt")
>>> type(f)
<type 'file'>
>>> type(f.read())
<type 'str'>
>>> f.read()
''
>>>print f.read()
aac66f36-d2ad-4d94-9804-2220262cc354
c5a1b5ee-32b6-4912-8b90-ece3bd36d1e5
90e6509a-e918-447e-92ee-b853b9b49f15
7b7495d3-1aa5-48b5-a305-ae137d46d605
>>> f.readlines()
[]
>>> type(f.readlines())
<type 'list'>
>>> print f.readlines()
[]
>>> for i in f.readlines():
... type (i)
... print i
<type 'str'>
994761db-37fa-4243-9d13-0acd193763dd
<type 'str'>
993b2806-51fe-412d-8df2-526ea550e889
<type 'str'>
aac66f36-d2ad-4d94-9804-2220262cc354
>>> type(f.readline())
<type 'str'>
// // //
>>> f = open("dup_file - Copy (2).txt")
>>> f.readline()
'8957d983-05e2-4a54-a7b3-f1532421c7a7\n'
>>> f.readline()
'ccf30309-2a02-4d09-8ea8-70c3da8de09d\n'
>>> f.readline()
'492ddb07-e0c5-4dda-ae91-8b3700d05a79\n'
>>> f.readline()
'9cee8472-dfc1-49ac-90c3-572f68373934\n'
>>> f.readline()
''
>>> f.readline()
''
// // // 第1次调用f.readline(),没有输出或者操作,后面再也无法循环到
>>> f = open("dup_file - Copy (2).txt")
>>> type(f.readline())
<type 'str'>
>>> f.readline()
'ccf30309-2a02-4d09-8ea8-70c3da8de09d\n'
>>> f.readline()
'492ddb07-e0c5-4dda-ae91-8b3700d05a79\n'
>>> f.readline()
'9cee8472-dfc1-49ac-90c3-572f68373934\n'
>>> f.readline()
''
>>> f.readline()
// // // 使用文件对象f
>>> f = open("dup_file - Copy (2).txt")
>>> for i in f:
... type(i)
... print i
...
<type 'str'>
8957d983-05e2-4a54-a7b3-f1532421c7a7
<type 'str'>
ccf30309-2a02-4d09-8ea8-70c3da8de09d
<type 'str'>
492ddb07-e0c5-4dda-ae91-8b3700d05a79
<type 'str'>
9cee8472-dfc1-49ac-90c3-572f68373934
>>> f = open("dup_file - Copy (2).txt")
>>> for i in f.readlines():
... type(i)
... print i
...
<type 'str'>
8957d983-05e2-4a54-a7b3-f1532421c7a7
<type 'str'>
ccf30309-2a02-4d09-8ea8-70c3da8de09d
<type 'str'>
492ddb07-e0c5-4dda-ae91-8b3700d05a79
<type 'str'>
9cee8472-dfc1-49ac-90c3-572f68373934
python 如何读取大文件的更多相关文章
- Python逐块读取大文件行数的代码 - 为程序员服务
Python逐块读取大文件行数的代码 - 为程序员服务 python数文件行数最简单的方法是使用enumerate方法,但是如果文件很大的话,这个方法就有点慢了,我们可以逐块的读取文件的内容,然后按块 ...
- Python花式读取大文件(10g/50g/1t)遇到的性能问题(面试向)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_97 最近无论是面试还是笔试,有一个高频问题始终阴魂不散,那就是给一个大文件,至少超过10g,在内存有限的情况下(低于2g),该以什 ...
- python json及mysql——读取json文件存sql、数据库日期类型转换、终端操纵mysql及python codecs读取大文件问题
preface: 近期帮师兄处理json文件,须要读到数据库里面,以备其兴许从数据库读取数据.数据是关于yelp站点里面的: https://github.com/Yelp/dataset-examp ...
- Python 之读取大文件readline与readlines的差别
import time def get_all_lines(filename): start_time = time.time() try: f = open(filename, 'rb') exce ...
- Python读取大文件的"坑“与内存占用检测
python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...
- Python读取大文件(GB)
Python读取大文件(GB) - CSDN博客 https://blog.csdn.net/shudaqi2010/article/details/54017766
- 强悍的Python读取大文件的解决方案
这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件. 1. read() 接口的问题 f =open(filename, ...
- PHP 与Python 读取大文件的区别
php读取大文件的方法 <?php function readFile($file) { # 打开文件 $handle = fopen($file, 'rb'); while (feof($ ...
- Python json 读取 json 文件并转为 dict
Python json 读取 json 文件并转为 dict 在 D 盘 新建 test.json: { "test": "测试\n换行", "dic ...
随机推荐
- javac命令
javac命令 javac命令初窥 注:以下红色标记的参数在下文中有所讲解. 用法: javac <options> <source files> 其中, 可能的选项包括: ...
- 关于C++中Object所占内存空间探索1
关于C++中Object所占内存空间探索(一) 有如下问题: 1. 一个空类, class X{ }; 2.类中含有数据成员(Data Member), class X { public: //Fun ...
- javascript操作写入txt文件及消息: Automation 服务器不能创建对象问题
简单的写入txt代码: function WriteTxt() { var fso, tf; fso = new ActiveXObject("Scripting.Fil ...
- Kettle的应用——对mysql数据进行表输入与导出
Kettle的应用——对mysql数据进行表输入与导出 1. 下载好kettle解压包 网址:http://sourceforge.net/projects/pentaho/files/Data%20 ...
- Js-Html 前端系列--checkbox
今天搞全选按钮,设置Checkbox的时候,处于Checked状态但是不显示勾.最后得出解决方案: var c = boxcList.eq(i).attr("checked"); ...
- jQuery插件slides实现无缝轮播图特效
初始化插件: slides是一款基于jQuery无缝轮播图插件,支持图内元素动画,可以自定义动画类型 1 2 3 4 5 6 7 8 9 10 $(".slideInner").s ...
- Python_web框架解析
这一阵正在学习廖雪峰老师的实战课程,这里对其中web.py框架进行一些分析,总结一下学到的东西. 这一部分的课程网站:http://www.liaoxuefeng.com/wiki/001374738 ...
- ViewCompat.animate(view) floatEval.evaluate() argbEval.evaluate()
ViewCompat.animate(ivHead) .translationX(60)// .setInterpolator(new CycleInterpolator(4))//循环执行// .s ...
- 在SQL SERVER中查找用分隔符分隔的数据
SELECT * FROM [DB_SCJC].[dbo].[tn_Manager] 其中, CHARINDEX({1},{2})中,{1}是要查找的字符,{2}是字典库.返回值为{1}在{2}中的位 ...
- Ubuntu中Qt5.7.0无法输入中文
把libfcitxplatforminputcontextplugin.so复制到安装的Qt目录下的两个文件夹中 sudo apt install fcitx-frontend-qt5 sudo cp ...