【问题标题】:Infinite loop using iter method使用iter方法的无限循环
【发布时间】:2019-11-25 05:23:48
【问题描述】:

我是一名业余爱好者,我正在尝试编写自己的(非常糟糕的)压缩工具,只是为了好玩。 以下代码用于读取文本文件并创建文件中每个字符索引的字典。 我试图以 1K 块读取文件,只是为了它,但由于某种原因,我得到了一个无限循环。 我猜我误解了“Iter”方法中的某些内容。

代码:

def dictify(myFile):
    compDict = {}
    count = 0
    with open(myFile, 'r') as f:
        for chunk in iter(f.read, 1024):
            for ch in chunk:
                if ch in compDict:
                    compDict[ch].append(count)
                else:
                    compDict[ch] = []
                    compDict[ch].append(count)
                count += 1
            print(compDict)
    print(compDict)

dictify('test.txt')

print 语句用于调试目的,我将其保留,因为它会让运行代码的人清楚地知道 inf 所在的位置。循环是。 另外 - txt 文件可以是任何东西。我的只是说“我是海象”

任何想法我做错了什么? 谢谢!

【问题讨论】:

    标签: python-3.x infinite-loop


    【解决方案1】:

    iter 不是这样工作的。

    doc 中给出了您的示例:

    from functools import partial
    
    with open('mydata.db', 'rb') as f:
        for block in iter(partial(f.read, 64), b''):
            process_block(block)
    

    如果您使用带有 2 个参数的 iter,第一个必须是可调用的,第二个必须是 sentinel;即当iter 需要终止时要寻找的东西。

    在您的情况下,第二个参数是一个整数 (1024); f.read 返回一个字符串;所以它永远不会终止。

    如果您以文本模式(而不是二进制)读取文件,则需要进行以下更改(我还调整了您的块大小):

    with open('mydata.db', 'r') as f:
        for block in iter(partial(f.read, 1024), ''):
            process_block(block)
    

    【讨论】:

    • 如果您的文件中有文本,请务必将其作为文本读取!文档中的示例仅适用于二进制情况。
    • 非常感谢!
    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多