将当前行追加到上一行

时间:2019-05-13 06:00:54

标签: python parsing ldif

我正在尝试解析.ldif文件,但未能获得所需的输出。任何帮助深表感谢。

这是我使用python所做的事情:

lines = open("use.ldif", "r").read().split("\n")
for i, line in enumerate(lines):
   if not line.find(":"):
      lines[i-1] = lines[-1].strip() + line
      lines.pop(i)

open("user_modified.ldif", "w").write("\n".join(lines)+"\n")

use.ldif(输入文件)

dn: cnh
changetype: add
objectclass: inetOrgPerson
objectclass: cdsUser
objectclass: organizationalPerson
objectclass: Person
objectclass: n
objectclass: Top
objectclass: cd
objectclass: D
objectclass: nshd shdghsf shgdhfjh jhghhghhgh
 hjgfhgfghfhg
street: shgdhgf

dn: cnh
changetype: add
objectclass: inetOrgPerson
objectclass: hjgfhgfghfhg
street: shgdhgf kjsgdhgsjhg shdghsgjfhsfsf
 jgsdhsh
company: xyz

user_modified.ldif(我的代码输出)

我得到相同的输出,没有任何修改。我觉得这是因为我正在做split("\n"),但我不知道还有什么可以做。

所需的输出

dn: cnh
changetype: add
objectclass: inetOrgPerson
objectclass: cdsUser
objectclass: organizationalPerson
objectclass: Person
objectclass: n
objectclass: Top
objectclass: cd
objectclass: D
objectclass: nshd shdghsf shgdhfjh jhghhghhghhjgfhgfghfhg
street: shgdhgf

dn: cnh
changetype: add
objectclass: inetOrgPerson
objectclass: hjgfhgfghfhg
street: shgdhgf kjsgdhgsjhg shdghsgjfhsfsfjgsdhsh
company: xyz

正如您在输出文件user_modified.ldif中看到的那样,第一个条目中的对象类和第二个条目中的街道到达下一行。 如何将它们放在同一行中,如所需的输出中一样。

预先感谢

2 个答案:

答案 0 :(得分:2)

lines = open("use.ldif", "r").read().split("\n")
for i, line in enumerate(lines):
   if len(line) > 0 and not (":" in line):
       lines[i-1] = lines[i-1].strip() + line
       lines.pop(i)

open("user_modified.ldif", "w").write("\n".join(lines)+"\n")
  • 如果答案很好,请投票并接受答案

答案 1 :(得分:1)

在这里我的方法很不错:

import re

pattern = re.compile(r"(\w+):(.*)")

with open("use.ldif", "r") as f:
    new_lines = []

    for line in f:
        if line.endswith('\n'):
            line = line[:-1]

        if line == "":
            new_lines.append(line)
            continue

        l = pattern.search(line)
        if l:
            new_lines.append(line)
        else:
            new_lines[-1] += line

with open("user_modified.ldif", "wt") as f:
    f.write("\n".join(new_lines))

稍微看一下代码,建议您做一些文件遍历的文档。也许您仍然是Python的初学者,但是在您的代码中显示,您正在read()split('\n'),最后是for语句中处理了3次整个文件。当您打开文件时,所得到的称为描述符,并且如您在我的代码中所见,您可以使用它来遍历文件,并在每一步上获得一行。对于较大的文件,这将成为重要的性能技巧。