使用Python替换文本文件中一行中的一列



我有一个文本文件,它有以下内容

<>之前##关键词:#磷酸铁锂结束名字Li5FeO4细胞18.557309 18.316802 9.125725 90.047539 90.100646 90.060551 00 00 00 0部分1李芯0.06001 0.059408 0.849507 1 1 00 00 0Li1 core 0.025416 0.339078 0.128746 1 1 0 0 0 0 0Li2芯0.02517 0.838929 0.130747 1 1 0 0 0 0 0Li3 core 0.525498 0.339179 0.127632 1 1 0 0 0 0Li4芯0.524753 0.841333 0.129329 1 1 0 0 0 0 0Li5 core 0.179907 0.158182 0.634012 1 1 0 0 0 0 0Li6 core 0.180817 0.666028 0.628327 1 1 0 0 0 0这是我需要提供给在一些研究应用中使用的工具的输入。现在我需要替换第一行的0,从最后一列的第三列的Li开始。也就是说,从Li开始的每一行的末尾都有四个零。我需要替换第二个零,因此文件将具有如下内容:

<>之前##关键词:#磷酸铁锂结束名字Li5FeO4细胞18.557309 18.316802 9.125725 90.047539 90.100646 90.060551 00 00 00 0部分1李芯0.06001 0.059408 0.849507 1 1 01 00 0Li1 core 0.025416 0.339078 0.128746 1 1 0 0 0 0 0Li2芯0.02517 0.838929 0.130747 1 1 0 0 0 0 0Li3 core 0.525498 0.339179 0.127632 1 1 0 0 0 0Li4芯0.524753 0.841333 0.129329 1 1 0 0 0 0 0Li5 core 0.179907 0.158182 0.634012 1 1 0 0 0 0 0Li6 core 0.180817 0.666028 0.628327 1 1 0 0 0 0这必须为不同位置的零做多次,我有以下代码。在相同的代码中,我还做了一些操作。

import os
import shutil
import time

def edit_file(column, next_column):
# Processing x.gin file
file_name = './' + column + '.gin'
file_handler = open(file_name, 'r')
print("Processing " + file_name + " file")
contents = file_handler.readlines()
find_line = contents[14]
find_line_array = find_line.split('t')
print(find_line_array)
# change values according to the file name
if column == 'x':
find_line_array[8] = 1
elif column == 'y':
print(contents)
print(find_line_array)
find_line_array[9] = 1
elif column == 'z':
find_line_array[10] = 1
elif column == 'xy':
find_line_array[8] = 1
find_line_array[9] = 1
elif column == 'yz':
find_line_array[9] = 1
find_line_array[10] = 1
elif column == 'xz':
find_line_array[8] = 1
find_line_array[10] = 1
formatted = 't'.join(map(str, find_line_array))
contents[14] = formatted
with open(file_name, 'w') as f:
for item in contents:
f.write("%sn" % item)
print("Formatting completed for " + file_name)
print('Executing GULP command ----')
gulp_command = 'gulp ' + column + '.gin > ' + column + '.gout'
print(gulp_command)
shutil.copy(file_name, next_column+'.gin')
file_handler.close()
os.system(gulp_command)
while not os.path.exists('./Li.grs'):
print('Waiting for output file')
time.sleep(1)
if os.path.isfile('./Li.grs'):
print('renaming file')
os.rename('./Li.grs', next_column+'.gin')
os.rename('./Li.grs', column+'.grs')
return True

if __name__ == '__main__':
print('Starting Execution')
column_list = ['x', 'y', 'xy', 'yz', 'xz']
print(column_list)
for index, column in enumerate(column_list):
if column != 'xz':
edit_file(column, column_list[index + 1])
else:
edit_file(column, 'xz')
print('Execution completed')

我正在正确地替换它并重写文件。但是这个文件的格式似乎不正确,因为它有额外的新行。是否有可能我可以重写单行,这样我就可以保持文件完全相同的格式。

我为此创建了一个函数。试试这个

def replace(filename,row,column,value):
columnspan = "     "
data = open(filename).read().split("n")
for i in range(len(data)):
data[i] = data[i].split(columnspan)
data[row][column] = value
write=""
for i in range(len(data)):
for x in range(len(data[i])):
write+=(str(data[i][x])+columnspan)
write += "n"
write.strip()
file = open(filename,"w")
file.write(write)
file.close()

您可以使用regex来查找和更新文本:

import re
with open('input.txt', 'r') as f1, open('output.txt', 'w') as f2:
data = f1.read()
match = re.findall('Lis+w+s+d+.d+s+d.d+s+d.d+s+ds+ds+ds+d', data)
for m in match:
data = data.replace(m, f'{m[:-1]}1')
f2.write(data)

输出:

#
#   Keywords:
#
LiFePO4
end
name    Li5FeO4
cell
18.557309   18.316802   9.125725    90.047539   90.100646   90.060551 0 0 0 0 0 0
fractional  1
Li  core    0.06001     0.059408    0.849507    1   1   0   1   0   0
Li1 core    0.025416    0.339078    0.128746    1   1   0   0   0   0
Li2 core    0.02517     0.838929    0.130747    1   1   0   0   0   0
Li3 core    0.525498    0.339179    0.127632    1   1   0   0   0   0
Li4 core    0.524753    0.841333    0.129329    1   1   0   0   0   0
Li5 core    0.179907    0.158182    0.634012    1   1   0   0   0   0
Li6 core    0.180817    0.666028    0.628327    1   1   0   0   0   0

最新更新