【问题标题】:Mixing files and loops混合文件和循环
【发布时间】:2010-10-24 00:18:42
【问题描述】:

我正在编写一个脚本,它记录来自另一个程序的错误,并在遇到错误时重新启动程序。无论出于何种原因,该程序的开发人员认为没有必要默认将此功能放入他们的程序中。

无论如何,程序获取一个输入文件,对其进行解析,然后创建一个输出文件。输入文件采用特定格式:

UI - 26474845
TI - the title (can be any number of lines)
AB - the abstract (can also be any number of lines)

当程序抛出错误时,它会为您提供跟踪错误所需的参考信息 - 即 UI、哪个部分(标题或摘要)以及相对于标题或摘要开头的行号。我想使用一个函数从输入文件中记录有问题的句子,该函数采用参考号和文件,找到句子并记录它。我能想到的最好方法是在文件中前进特定次数(即 n 次,其中 n 是相对于部分开头的行号)。这样做似乎有意义的方式是:

i = 1
while i <= lineNumber:
    print original.readline()
    i += 1

我不明白这会使我丢失数据,但 Python 认为它会,并说 ValueError: Mixing iteration and read methods would lose data。有谁知道如何正确执行此操作?

【问题讨论】:

  • -1:sn-p 中缺少代码。显示的代码中可能缺少“for something in original:”。

标签: python python-2.7 file loops while-loop


【解决方案1】:

这是一个没有丑陋的while True 模式并且没有其他模块的版本:

for line in iter(original.readline, ''):
    if …:   # to the beginning of the title or abstract
        for i in range(lineNumber):
            print original.readline(),
        break

【讨论】:

    【解决方案2】:

    您收到 ValueError 是因为您的代码除了 original.readline() 之外可能还有 for line in original:。一个简单的解决方案正在改变,它可以在不使程序变慢或消耗更多内存的情况下解决问题

    for line in original:
        ...
    

    while True:
        line = original.readline()
        if not line: break
        ...
    

    【讨论】:

    • 你一针见血——我曾经使用for,以及while。这是最快的解决方法。谢谢,也感谢其他人的回复。
    • 但是有什么问题呢??为什么不用for
    【解决方案3】:

    假设您只需要一行,这可能会有所帮助

    import itertools
    
    def getline(fobj, line_no):
        "Return a (1-based) line from a file object"
        return itertools.islice(fobj, line_no-1, line_no).next() # 1-based!
    
    >>> print getline(open("/etc/passwd", "r"), 4)
    'adm:x:3:4:adm:/var/adm:/bin/false\n'
    

    您可能想要捕获 StopIteration 错误(如果文件的行数较少)。

    【讨论】:

      【解决方案4】:

      使用forenumerate

      例子:

      for line_num, line in enumerate(file):
          if line_num < cut_off:
              print line
      

      注意:假设您已经在清理文件句柄等。

      此外,如果您喜欢更实用的风格,takewhile 函数可能会很有用。

      【讨论】:

        猜你喜欢
        • 2019-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        相关资源
        最近更新 更多