我的程序解析不同类型的日志文件,其中一些在文件开头有空行。获取第一行的变量在此程序中非常重要。我已经想出如何让它跳过空白行,但我无法让它将第一行视为真正的第一行。我的代码如下
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;
答案 0 :(得分:4)
lines = filter(None, (line.rstrip() for line in open(logfile)))
这将为您提供文件中所有非空行的列表。
<强>更新强>
如果你有内存约束,那么你可以使用itertools.ifilter
返回生成器而不是列表 - 由CristianCiupit建议
答案 1 :(得分: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()
永远不会返回的值开始。这保证了我们不会离开直到它发挥作用。
答案 2 :(得分:0)
如果要解析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) '.' );