Python 如何高效读取 大文件?

2015-05-04 20:33:30 +08:00
 lonin
有一个1万多行的txt文本,读取第一行的文字 append 到一个空列表list[]中,然后读取第二行的文字替换到列表中,依次循环直到最后一行,有什么高效率的办法?
4842 次点击
所在节点    Python
13 条回复
xiaozi
2015-05-04 20:37:48 +08:00
只要每行的长度不是很大的话,1w 行,小 case 吧;直接全部读到内存好了。
oxyflour
2015-05-04 20:49:16 +08:00
with open(fileName, 'r') as fin:
for line in fin.readlines():
pass # do sth

试过读几百兆的文本,并不需要什么特别的处理
Septembers
2015-05-04 20:56:30 +08:00
clino
2015-05-04 21:24:41 +08:00
"读取第二行的文字替换到列表中"这是什么意思?
做完了最后剩下还是一个元素的list?
seki
2015-05-04 21:49:44 +08:00
一万行不多啊,除非你一行有几万字……不过同没看懂你的操作描述
frankzeng
2015-05-04 22:20:10 +08:00
开销在磁盘io上,一万行很少的数据,读到内存中去
lonin
2015-05-04 22:21:48 +08:00
@clino @seki 不好意思,我没表述清楚,就是把某一行字加入到一个空集?(空的列表),每次列表中都只有当前读取到的那一行文字。起初我以为一万多行,一行一行读取很占内存。
clino
2015-05-04 22:29:40 +08:00
@lonin 那就用 for line in file 就行了,这个用的是迭代器,不会占大内存
lonin
2015-05-04 22:44:57 +08:00
<p>hello world!<p>
<p>hello
world!<p>
@clino 谢谢你的回答,接着问一个问题,怎样可以把上面的第二行与第三行合并起来?正则表达式可以匹配第三行,
clino
2015-05-04 23:02:32 +08:00
@lonin 你要一行行地读并且一行行地分析html?
这个可能对你有用: https://docs.python.org/2/library/htmlparser.html#example-html-parser-application
里面的feed可以一行行往里面填数据
fy
2015-05-04 23:05:30 +08:00
@lonin 楼主确定标签是不闭合的吗?

底子还是这个正则:
re.search(r'<(.*?)>.*?</\1>', '<p>123</p>2').group(0)
'<p>123</p>'

思路是在读取操作中简单的分为两个状态:

for i in lines:
状态1 尚未出现成对元素:继续读下一行,将本行结果和下一行合并
状态2 出现闭合元素:储存内容

举个栗子:

[初始化]
buf = ''
buf += newline

[1] buf : <p>hello
不匹配,continue

[2] buf : <p>hello world!</p>
匹配,储存数据
buf = ''

[3] ...
[4] ...
fy
2015-05-04 23:09:04 +08:00
@clino 这个好强。。收藏了
xxer
2015-05-06 14:24:52 +08:00
readlines从内存使用情况看,效果很差

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188432

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX