作者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