我正在尝试编写一个python脚本,该脚本将接收一个文件(将其称为input.txt
),并寻找以文本“移动到第一个边界点”结尾的行。然后,需要用该行之后的行替换该行,并用第一行替换它的行。文件的其余部分必须保持不变。在文件中有很多实例需要发生。
我的思考过程就是这样。查找以“移动到第一个边界点”结尾的线。一旦代码找到它,它将把该行保存为变量,然后从文件中删除该行。然后,如果下一行以“ restore layer Z”结尾(下一行总是如此),则需要在该行之后添加之前删除的行。
这就是我想要做的:
'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
我希望输入文件保持不变,同时创建一个新的输出文件。相反,什么也没发生。
谢谢您的帮助!我对此很陌生。
答案 0 :(得分:0)
在这里,我们将txt
文件中的行读入变量s
(字符串列表)。然后,自定义函数swap_lines_in_text()
进行交换并返回一个数据帧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
用于处理文本(目标行交换)的自定义功能
此函数将返回一个
pandas.DataFrame
对象。
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
虚拟数据
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())