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 ...
随机推荐
- Jquery EasyUI tabs处理
一 获取选中的 Tab 1. // 获取选中的 tab panel 和它的 tab 对象 2. var pp = $('#tt').tabs('getSelected'); 3. var ta ...
- iOS核心应用对象
IOS应用之设计模式:模型-视图-控制器 iOS应用与其它应用的区别就在于它所管理的数据(和相应的业务逻辑)以及将数据展现给用户的方式.大多数UIKit对象并不定义应用而是帮助完善其行为.例如,你的应 ...
- $(window).height() 文档高度问题
遇到一个这样的问题: 有个项目做的好好的,测试时一步一步小心过来,做了一段时间后,发现前面的完成的功能出了问题了 首先描述下出问题的功能: 做滚动条下拉加载的时候用的网上找的一种方法 $(window ...
- nginx反射理传apache配置 - cookie去哪儿了?
在公司接手了个微信项目,由于微信环境下访问网站需要使用对外开放的域名,所以有相关问题,都是直接运维同事帮忙处理. 原理是这样: 方案一: 1. 将域名解析指向测试服务器的地址: 2. 开放相关端口访问 ...
- Java如何根据IP获取当前定位
当今购物.旅游等服务型的网站如此流行,我们有时候也会碰到这样网站的开发. 在开发此类网站时,为了增加用户的体验感受,我们不得不在用户刚进入网站时定位到用户所在地, 更好的为用户推荐当地产品.比如去哪儿 ...
- Python学习笔记---形式参数(parameter)和实际参数(argument)
def mydemo(name): '函数定义过程中的name是叫形参' #因为它只是一个形式,表示占据一个参数位置 print('传递进来的' + name + '叫做实参,因为它是具体的参数值!' ...
- (二)Python是一门什么样的语言?
在学习python是一门什么样的语言之前首先需要知道什么是编译和解释? 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而 ...
- 【CSS学习笔记】背景图片
直接看代码: background: blue; /*页面背景为蓝色,很简单的代码*/background-image:url(small.jpg); /*页面背景是名字叫small.jpg的图片*/ ...
- 使用signalR创建聊天室。
浏览器支持Html5的情况下,SignalR使用WebSockets,当不支持时SignalR将使用其它技术来实现通讯. 界面如下:左侧包含三种聊天对象,不同的聊天对象会创建不同的对话框. 设计思路参 ...
- android 音频播放总结 soundlPool,MediaPlay
soundlPool 用于小音频的播放多个同时播放. 使用步骤: 步骤一: 首先下载音频文件可以将其放入assets文件夹下或者res下的raw文件夹下,区别在于assets下可以再新建文件夹二raw ...