首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python文件缩减-第2部分

Python文件缩减-第2部分
EN

Stack Overflow用户
提问于 2013-03-27 11:09:18
回答 1查看 75关注 0票数 0

这是对我上一个问题(text file reduction with randomization in Python)的跟进。正在修改以运行多个裁减,但只有第一个输出文件包含裁减,以下3个文件为零大小。这肯定是我看不到的明显的东西..。

代码语言:javascript
复制
#!/usr/bin/env python
import random
import sys
from itertools import chain, groupby

def choose_random(iterator, fraction, random=random.random):
    """Lazy analog of:

        L = list(iterator)
        k = int(len(L) * fraction + .5) or 1 # get at least one
        result = random.sample(L, k)

    Note: this function doesn't randomize the order of elements
          that would require to keep selected elements in memory
          and number of output elements is not exactly k
    """
    # always yield at least one item if input is not empty
    item = next(iterator)
    it = (x for x in chain([item], iterator) if random() < fraction)
    for x in chain([next(it, item)], it):
        yield x

def getkey(line):
    return line.split("\t")[3] # 4th column

reductions = [0.25, 0.50, 0.75, 1]
filename = "foo"
outfile = [open("-".join([x, filename]), "w") for x in map(str, reductions)]

try:
    with open(filename, "r") as f:
        for ln, k in enumerate(map(float, reductions)):
            for key, group in groupby(f, key=getkey):
                outfile[ln].writelines(choose_random(group, fraction=k))

finally:
    for f in outfile:
        f.close()

输出显示如下(文件0.25-foo包含正确的缩减,其余的为空):

代码语言:javascript
复制
-rw-r--r--  1 staff  staff   53326048 Mar 27 03:42 0.25-foo
-rw-r--r--  1 staff  staff          0 Mar 27 03:42 0.5-foo
-rw-r--r--  1 staff  staff          0 Mar 27 03:42 0.75-foo
-rw-r--r--  1 staff  staff          0 Mar 27 03:42 1-foo
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-27 11:17:15

您只打开一次foo,但尝试对其进行四次迭代。在第一次还原结束时,您将处于文件的末尾。要么重新打开它:

代码语言:javascript
复制
try:
    for ln, k in enumerate(map(float, reductions)):
        with open(filename, "r") as f:
            for key, group in groupby(f, key=getkey):
                outfile[ln].writelines(choose_random(group, fraction=k))

finally:
    for f in outfile:
        f.close()

或在每次还原后倒带:

代码语言:javascript
复制
try:
    with open(filename, "r") as f:
        for ln, k in enumerate(map(float, reductions)):
            for key, group in groupby(f, key=getkey):
                outfile[ln].writelines(choose_random(group, fraction=k))
            f.seek(0)

finally:
    for f in outfile:
        f.close()

我曾经打开过这两个文件:

代码语言:javascript
复制
reductions = [0.25, 0.50, 0.75, 1.0]
filename = "foo"

for fraction in reductions:
    with open(filename, "r") as f, open('%s-%s' % (fraction, filename), 'w') as outfile:
        for key, group in groupby(f, key=getkey):
            outfile.writelines(choose_random(group, fraction=fraction))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15657388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档