【问题标题】:how bring some text to a line before?如何将一些文本带到一行之前?
【发布时间】:2021-05-18 04:32:47
【问题描述】:

我有一个这样的文本文件:

1156348 epsilon[998] B          1e-08                             
1156349 epsilon[999]B          1e-08                             
1156350 epsilon[1001]
                    B          1e-08                             
1156351 epsilon[1002]
                    B          1e-08                             
1156352 epsilon[1003]
                    B          1e-08  

如您所见,最后 3 行与前 2 行略有不同。我怎样才能像这样将那些B 带到上面的行:

1156348 epsilon[999] B          1e-08                             
1156349 epsilon[1000]B          1e-08                             
1156350 epsilon[1001]B          1e-08                             
1156351 epsilon[1002]B          1e-08                             
1156352 epsilon[1003]B          1e-08          

目的是获取每一行的数字。这是更大文件的一部分。我发现所有行都包含 epsilon,然后抓取数字1e-08。但是因为在索引 1000 之后它们在。下一行我无法抓住它们。

a1=[]
f1 = open('/Users/naghmeh/Documents/skill_trend/optimization/typex2.txt', "r")
for line in f1:
    if "epsilon" in line: 
        a1.append(line)
f.close()
t=[float(s.split()[3]) for s in map(str.strip, a1)]

【问题讨论】:

  • 您搜索了什么,找到了什么?你尝试过什么,它是如何失败的?转换的原理是什么——字段太少就合并,行太短就合并,第一个非空白token是B就合并?
  • @tripleee 我尝试在索引 1000 之后使用 for 循环,但我无法编写用于修复行的代码。
  • 您可以在任何 IDE 中使用正则表达式查找和替换。在 python 中,import re; d = open('file.txt').read(); d = re.sub('\n.*?B','B', d); open('file.txt', 'w').write(d)
  • @tripleee 请查看编辑。
  • f.close() 是一个NameError,你的意思是f1;但是使用with open 上下文管理器更加优雅和强大。

标签: python file text


【解决方案1】:

您的尝试只会挑选出其中带有“epsilon”的行。相反,您想收集所有行,但如果没有“epsilon”,则附加到上一行。

a1 = []
with open(filename, 'r') as f1:
    for line in f1:
        line = line.rstrip('\n')
        if "epsilon" in line:
            a1.append(line)
        else:
            a1[-1] += line

如果它不包含“epsilon”,这会将行粘合到上一行的末尾(a1[-1],即a1 中的最后一个元素),否则会复制您现有的逻辑。

如果第一行不包含“epsilon”,这将崩溃,但我将其留给您,以使其对您的用例具有健壮性。

可能避免硬编码复杂的路径;在当前目录中查找文件,或者让脚本接受输入文件名作为命令行参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 2021-03-31
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多