【问题标题】:Skip a blank line when reading a file in python using readline使用 readline 在 python 中读取文件时跳过空行
【发布时间】:2014-07-14 18:34:55
【问题描述】:

我的程序解析不同类型的日志文件,其中一些文件的开头有空行。在这个程序中,为第一行获取一个变量非常重要。我已经想出了如何让它跳过空白行,但我无法让它将带有文本的第一行视为真正的第一行。我的代码如下

 if first_line.find('Chain') != -1:
    first_time = int(searchforfirsttime.group(2)

之后我需要一个 else 语句,使 first_line = 文件的第二行。 谢谢。

编辑:

我正在阅读的文件的前几行是

(Blank Line)
CODE: 30;  Chain 1;  Time = 92473622;   PASSIVE:; 127; 127; 127; 127;   ACTIVE:; 127; 127; 127; 127; 127; 127; 127; 127; 127; 127;   CAPS:; 0; 0; 0; 0; 0; 0; 0; 0; 0;   DELAYS:;   0; 0; 0; 0;
CODE:31;  Chain1:;  Time = 92473765;  DCInputPower = -28.587273; DCOutputPower = -23.745722; DCCoeffs:  I:0; Q:0I:0; Q:0I:0; Q:0I:0;

【问题讨论】:

  • 你能给我们文件的前几行吗?
  • 你是如何获得第一行的?我认为大多数时候,完全相同的代码将用于获取第二个链接并将其放入first_line
  • 与主要问题无关,建议将if first_line.find('Chain') != -1:换成if 'Chain' in first_line:
  • 您想只跳过第一个空行还是所有空行,包括文件中间或末尾的空行?

标签: python parsing python-2.7 readline


【解决方案1】:
lines = filter(None, (line.rstrip() for line in open(logfile)))

这将为您提供文件中所有非空行的列表。

更新:

如果您有内存限制,那么您可以使用itertools.ifilter,它返回一个生成器而不是列表 - 由CristianCiupit 建议

【讨论】:

  • 为了阻止TheSoundDefense 抱怨内存使用情况,添加基于生成器的解决方案不会有什么坏处,例如使用itertools.ifilter 或生成器理解的一种。
  • @CristianCiupitu 是的!哈哈。我只是想在我的答案中添加它。我以前没有考虑记忆的事情。谢谢!
  • @CristianCiupitu 但我喜欢抱怨内存使用...无论如何,创建非空行生成器可能是最好的解决方案。您可以将其直接插入现有代码中,几乎不需要更改其他部分。
  • @TheSoundDefense,投诉让我们进步:-)
  • 这行得通,但从我的情况来看,TheSoundDefense 有更好的解决方案。
【解决方案2】:

Anish Shah 有一个很好的答案如果你可以将你的文件放入内存中(编辑:现在他对这两种情况都有一个很好的答案)。如果不能,您可以随时尝试使用while 循环来保持循环,直到找到第一行并分配first_time

first_time = None
while first_time is None:
  first_line = file.readline()
  if first_line.find('Chain') != -1:
     first_time = int(searchforfirsttime.group(2))

我假设您使用readline() 来获取第一行。

这是我喜欢 Python 的一件事,就是动态类型。 first_time 可以是任何东西,真的,所以我们可以从一个 int() 永远不会返回的值开始。这保证了我们不会离开,直到它起作用。

【讨论】:

  • 现在是我吹毛求疵的时候了 :-) PEP 8 中的 programming recommendations 说“应该始终使用 isis not 来比较像 None 这样的单例,而不是相等运算符” .所以用first_time is None替换first_time == None
  • @CristianCiupitu 和一个公平的挑剔。答案已更改。
【解决方案3】:

如果您正在解析 ASCII 文本文件,您应该能够执行以下操作:

LogFilePathNameString = '/path/to/log/file/LogFileName.log';

FirstLineString = '';
FirstLineIndex = 0;

with open( LogFilePathNameString, 'r' ) as LogFileObject:

    LogFileObjectLineStringsList = LogFileObject.readlines();

    NumFileLines = len( LogFileObjectLineStringsList );

    for i in range( 0, NumFileLines, 1 ):

        CurrentLineString = LogFileObjectLineStringsList[ i ];

        if ( CurrentLine != '\n' ):

           FirstLineString = CurrentLineString;
           FirstLineIndex = i;
           break;

        #fi

    #rof

#hitw

print ( 'Found ' + str(FirstLineString) + ' on Line ' + str(FirstLineIndex) '.' );

【讨论】:

  • 删除一些空行和#end-of-block cmets 不会有什么坏处。 IE。使代码更加 Pythonic 和 PEP 8 兼容。
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
相关资源
最近更新 更多