有没有办法使用 python 交换文本文件中的两行文本?

Is there a way to swap two lines of text in a text file using python?

我正在尝试编写一个 python 脚本,它将获取一个文件(我们称之为 input.txt),并寻找以文本 "move to first perimeter point." 结尾的行 然后它需要用它后面的行替换这一行,用第一行替换它后面的行。文件的其余部分必须保持不变。文件中有大量需要发生这种情况的实例。

我的思考过程是这样的。查找以 "move to first perimeter point." 结尾的行 一旦代码找到它,它将将该行保存为一个变量,然后从文件中删除该行。然后,如果下一行以 "restore layer Z" 结尾(下一行总是如此),则需要在该行之后添加先前删除的行。

Here is what I am trying to do:

  1. 打开一个文件('input.txt')。
  2. 交换两个连续行的每次出现,其中,
    • 第一行结尾:'move to first perimeter point'
    • 第二行结尾:'restore layer Z'
    • 注意:众所周知,所有此类事件总是成对发生(第一行到第二行连续放置)。
  3. 将此更改写入新文件 ('output.txt')。

我试过使用 python 将其组合在一起。 python年前玩过,依稀记得怎么用。它抛出了错误。这是我在评论部分中建议的更正后的代码:(a) str.endwith --> str.endswith, (b) For --> for。任何建议都会非常有帮助和赞赏。

inp = open('input.txt','r')
out = open('output.txt', 'w')
prev = inp.readline()
for line in inp:
    if line.endswith('move to first perimeter point')
        prev = line
        if line.endswith('restore layer Z')
            out.write(line)
            out.write(prev)
    else:
        out.write(prev)
    prev = line
out.write(prev)
out.close()
inp.close

我希望输入文件保持不变,同时创建一个新的输出文件。相反,什么也没发生。

提前感谢您的帮助!我对此很陌生。

解决方案

这里我们将 txt 文件中的行读入变量 s(字符串列表)。自定义函数 swap_lines_in_text() 然后进行交换和 returns 数据帧 df 进行进一步处理(如果需要)。最后,您可以使用 df.Text.tolist() 将其转换为行列表,并使用 file.writelines() 将其写入新文件,如下所示。
由于没有提供样本数据,我自己制作了数据(参见:下面的虚拟数据)。为了测试解决方案,我将使用虚拟数据。

# Read-in the lines from input file
with open('input.txt', 'r') as f:
    s = f.readlines()

# Execute Swap
df = swap_lines_in_text(s, 
                        first_line_text = 'move to first perimeter point', 
                        second_line_text = 'restore layer Z')

# Show output (comment out the following line if need be)
# print(df)
print('\n'.join(df.Text.tolist()))

# Write to output file
with open('output.txt', 'w') as f:
    f.writelines(df.Text.tolist())

输出

A
B
D restore layer Z
C move to first perimeter point
E
F
H restore layer Z
G move to first perimeter point
I
K restore layer Z
J move to first perimeter point
L
M
N

Custom Function to Process the Text (Swapping of Target Lines)

This function would return a pandas.DataFrame object.

import pandas as pd

def swap_lines_in_text(s, first_line_text='move to first perimeter point', second_line_text='restore layer Z'):
    """
    s = string or a list of strings.
    """
    if isinstance(s, list):
        lines = s.copy()
    else:
        lines = s.strip().split('\n')
    df = pd.DataFrame({'Text': lines})
    df.Text = df.Text.str.strip()
    # Detect Target Lines (both first and second kinds)
    first_lines = df.Text.str.contains(first_line_text)
    second_lines = df.Text.str.contains(second_line_text)
    # Swap lines
    df.Text.loc[first_lines], df.Text.loc[second_lines] = df.Text[second_lines].tolist(), df.Text[first_lines].tolist()
    return df

Dummy Data

s = """
A 
B 
C move to first perimeter point 
D restore layer Z
E 
F 
G move to first perimeter point
H restore layer Z
I 
J move to first perimeter point
K restore layer Z
L 
M 
N
"""
print(s.strip())