有没有更好的方法从python中的文件一次读取两行:
with open(fn) as f:
for line in f:
try:
line2 = f.next()
except StopIteration:
line2 = ''
print line, line2 # or something more interesting
Run Code Online (Sandbox Code Playgroud)
我在2.5.4.新版本有什么不同?
编辑:删除的答案注意到:在py3k中你需要做下一个(f)而不是f.next().更不用说打印更改了
Ale*_*lli 17
import itertools
with open(fn) as f:
for line, line2 in itertools.izip_longest(f, f, fillvalue=''):
print line, line2
Run Code Online (Sandbox Code Playgroud)
唉,izip_longest需要Python 2.6或更高版本; 2.5只有izip,如果f有奇数行,将截断最后一行.当然,提供与发电机相同的功能非常容易.
这是一个更通用的"N一次"迭代器包装器:
def natatime(itr, fillvalue=None, n=2):
return itertools.izip_longest(*(iter(itr),)*n, fillvalue=fillvalue)
Run Code Online (Sandbox Code Playgroud)
itertools 通常是最好的方式,但是,如果你坚持自己实施,那么:
def natatime_no_itertools(itr, fillvalue=None, n=2):
x = iter(itr)
for item in x:
yield (item,) + tuple(next(x, fillvalue) for _ in xrange(n-1))
Run Code Online (Sandbox Code Playgroud)
在2.5中,我认为最好的方法实际上不是生成器,而是另一种基于itertools的解决方案:
def natatime_25(itr, fillvalue=None, n=2):
x = itertools.chain(iter(itr), (fillvalue,) * (n-1))
return itertools.izip(*(x,)*n)
Run Code Online (Sandbox Code Playgroud)
(因为2.5没有内置next,也有缺失izip_longest).
| 归档时间: |
|
| 查看次数: |
3584 次 |
| 最近记录: |