我的文件中有一些数据,其中很少有名称或字符串标记为下划线,但它们下面没有任何数据,而是有空格/空白行,因为下划线下面也有数据的行。
如何仅打印那些后面带有数据的带下划线的名称/字符串?
数据文件示例:
toran
—————————————————————————
nscld
—————————————————————————
polkit
—————————————————————————
ganter
—————————————————————————
tcp 0 0 D
tcp 0 0 D
tcp 0 0 D
polkit
—————————————————————————
在上面的文件中我只需要:
ganter
—————————————————————————
tcp 0 0 D
tcp 0 0 D
tcp 0 0 D
尝试了下面的代码,但它没有按预期工作,因为它无法获取字符串/名称,只能获取数据。
patt_match = False
with open("tran", "r") as lb:
for line in lb:
if '—————————————————————————' in line:
patt_match = False
elif 'tcp' in line:
patt_match = True
line = line.strip()
print(line)
实际输出:
tcp 0 0 D
tcp 0 0 D
tcp 0 0 D
最佳答案
问题在于,您只能在到达数据行后才确定是否需要打印标题。这意味着您需要保留变量中的最后一个标题,并在第一次出现数据行之前打印它。
下面是保留最后一行文本的示例实现。如果文本后跟包含 '----------------------------------------------------------------------------------------'
的行,则会将其标记为标题行,否则它将被视为数据行并打印最后一个标题。
由于您在评论中提到您的数据源自 Windows,因此我添加了一行以从您的行中删除所有尾随回车符。这对于没有它们的文件也可以正常工作:
with open('tran', 'r') as f:
prev_line = '' # Not strictly necessary, but avoids some warnings
for line in f:
line = line.rstrip('\r')
if '—————————————————————————' in line:
heading = prev_line
elif line.startswith('tcp'):
if '—————————————————————————' in prev_line:
print(heading)
print(prev_line)
print(line)
prev_line = line
这将跳过各部分之间的换行符,但您可以包含以下内容:
elif not line and prev_line.startswith('tcp'):
print(line)
这是一个IDEOne Link使用 @Flaming_Dorito 的示例演示代码。
关于python - 如果Python中没有数据或空行,如何删除带下划线的字符串/名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50515266/