有没有办法使用 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:
- 打开一个文件(
'input.txt'
)。
- 交换两个连续行的每次出现,其中,
- 第一行结尾:
'move to first perimeter point'
- 第二行结尾:
'restore layer Z'
- 注意:众所周知,所有此类事件总是成对发生(第一行到第二行连续放置)。
- 将此更改写入新文件 (
'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())
我正在尝试编写一个 python 脚本,它将获取一个文件(我们称之为 input.txt
),并寻找以文本 "move to first perimeter point." 结尾的行 然后它需要用它后面的行替换这一行,用第一行替换它后面的行。文件的其余部分必须保持不变。文件中有大量需要发生这种情况的实例。
我的思考过程是这样的。查找以 "move to first perimeter point." 结尾的行 一旦代码找到它,它将将该行保存为一个变量,然后从文件中删除该行。然后,如果下一行以 "restore layer Z" 结尾(下一行总是如此),则需要在该行之后添加先前删除的行。
Here is what I am trying to do:
- 打开一个文件(
'input.txt'
)。 - 交换两个连续行的每次出现,其中,
- 第一行结尾:
'move to first perimeter point'
- 第二行结尾:
'restore layer Z'
- 注意:众所周知,所有此类事件总是成对发生(第一行到第二行连续放置)。
- 第一行结尾:
- 将此更改写入新文件 (
'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())