Python:如果用反斜杠分隔,则将连续的行连接起来,同时也删除反斜杠

问题描述 投票:4回答:3

我有一个包含shell命令的文件。每个命令可以分为多行(末尾使用反斜杠):例如

  cmd1 -opt1 \  
    -opt2 val2  \  
    -opt3 val3 val4

如果结尾处用反斜杠分隔,我想加入连续的行。我也想在加入后删除反斜杠。

问题类似于:输入:['abc','def \\','ghi \\','jkl','yyy \\','zzz']输出:['abc','def ghi jkl','yyy zzz']

正在遍历仅列表解决方案?

with open("cmd", "r") as fp:
    cmd = ""
    cont = False
    list = []
    for line in fp:
        line = line.rstrip("\n")
        if line.endswith('\\'):
            line = line[:-1]
            if cont:
                cmd = cmd + line
                continue
            if cmd:
                list.append(cmd)
            cmd = line
            cont = True
        else:
            if cont:
                cmd = cmd + line
                if cmd:
                    list.append(cmd)
                cmd = ""
                continue
            cont = False
    print(list)
python
3个回答
4
投票

cmd = ['abc','def \\','ghi \\','jkl','yyy \\','zzz']

res =“ \ n” .join(cmd).replace(“ \\\ n”,“”).splitlines()

打印(res)

=> ['abc','def ghi jkl','yyy zzz']

线索


1
投票

正在遍历仅列表解决方案?

您将必须评估每一行的连接指示符并追加下一行。是的,您必须循环浏览。

这是一个使用生成器执行此操作的函数,因此整个输入不需要存储在内存中。

>>> sample = ['abc', 'def \\', 'ghi \\', 'jkl' , 'yyy \\', 'zzz']
>>>
>>> def join_lines(sequence):
...   i = iter(sequence)
...   buff = ''
...   try:
...     while True:
...       line = i.next()
...       if line.endswith('\\'):
...         line = line[:-1]
...         buff += line
...       else:
...         if buff:
...           buff += line
...           yield buff
...           buff = ''
...         else:
...           yield line
...   except StopIteration:
...     if buff:
...       yield buff
...
>>> print sample
['abc', 'def \\', 'ghi \\', 'jkl', 'yyy \\', 'zzz']
>>> print list(join_lines(sample))
['abc', 'def ghi jkl', 'yyy zzz']

0
投票

这可以是连接行并在这样的文件上进行迭代的方法:

with open("cmd", "r") as fp:
    data = fp.read()
    lines = data.replace("\\\n", "").splitlines()
    lines = [ x + "\n" for x in lines ]
    for line in lines:
        print(line)
© www.soinside.com 2019 - 2024. All rights reserved.