作者Leland (报废机器人的传说)
看板Python
标题Re: [闲聊] python有些很奇怪的地方...
时间Sun Jan 8 04:52:30 2006
※ 引述《huggie (huggie)》之铭言:
: ※ 引述《wawawa (哇哇哇○( ̄﹏ ̄)○)》之铭言:
: : 看到很多教学文件的范例是:
: : f = open('/etc/xxx', 'r')
: : for i in f.readlines():
: : print i,
: : 可是这样遇到大档案不会拖垮记忆体嘛
: : 我知道可以用read()限制每次读取的容量
: : 但是我想知道有没有比较好的写法?
: 我自己会用
: for line in open('/etc/xxx', 'r'):
: print line
: 这样应该也不用 close() 了
: 因为应该会 out of scope 然後自动被 garbage collect 吧!
: 我是这麽想的
我不确定这样 out of scope 会不会被 garbage collect 耶,
就算会我也不知道会不会自己 close 掉。
下面是我常用的几种读档方式,很方便,可是还是耗记忆体就是了。
开档:
f = open('input.txt')
1. 把文字档读成一个 list,一列一个 element,并去前後空白:
t = [i.strip() for i in f.readlines()]
2. 把文字档读成一个 list of lists,每列的一个个 word 分开,并去空白:
t = [i.split() for i in f.readlines()]
3. 把里面每列为若干个实数的文字档读成一个 list of lists,
并把读到的东西转成 float:
t = [[float(i) for i in j.split()] for j in f.readlines()]
4. 每列为空白分开的一个 int 和一个 float,做成一个 list of tuples:
def m(x):
return int(x[0]), float(x[1])
t = [m(i.split()) for i in f.readlines()]
关档:
f.close()
最後附一个因为好玩写的,把读到的东西「转置」的小程式:
#!/usr/bin/env python
from sys import stdin, stdout
t = [i.split() for i in stdin.readlines()]
m = max([len(i) for i in t])
for i in t:
i += [''] * (m - len(i))
t = [[x[i] for x in t] for i in xrange(m)]
for i in t:
for j in i:
stdout.write('%s\t' % j)
stdout.write('\n')
--
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS/CM/IT d-(+) s-:- a- C+++(++) UB++++ P-- L- E- W++ N+ o?>++ K->
w--(+) O-@ M+@ V- PS+ PE Y+ PGP++ t+ 5?>+ X+ R+@ tv+ b+ DI>+ D G
e++>++++ h+@ !r !y
------END GEEK CODE BLOCK------
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.50
1F:→ huggie:3跟4是不是打错了? 在我的电脑不能跑耶... 01/08 23:13
※ 编辑: Leland 来自: 140.112.30.50 (01/12 03:48)
※ 编辑: Leland 来自: 140.112.30.50 (01/12 04:07)
2F:→ Leland:3 应该是对的。4 打错了,现在改掉了。 01/12 04:07
3F:→ Leland:徵求 list comprehension 强者一名看看 4 有没有更好的写法 01/12 04:08