У меня есть файл данных (XYZ), который выглядит следующим образом:
14
#SCF Done -38.55119453
Zn -2.43131 -0.178647 2.16894
Zn -2.2929 -0.539171 -0.493818
Zn -2.34289 2.44492 -1.59345
Zn 0.239059 -2.08632 1.22433
Zn 0.791454 -1.00683 -1.82909
Zn 0.403902 1.12182 0.798016
Zn 3.14169 -0.521153 0.364154
O -0.331894 -0.65025 -0.154732
O 1.70509 -1.90609 -0.267181
O 1.69075 0.434366 -0.764456
O -2.16109 1.35301 -0.0741886
O -0.517414 -0.320352 2.01812
O 1.52574 -0.538064 1.60496
O 2.42682 1.26107 1.018
Я хочу изменить эту форму: Zn на {1 2.0}, O на {2. -2.0}
1 1 2.0 -2.43131 -0.178647 2.16894
2 1 2.0 -2.2929 -0.539171 -0.493818
3 1 2.0 -2.34289 2.44492 -1.59345
4 1 2.0 0.239059 -2.08632 1.22433
5 1 2.0 0.791454 -1.00683 -1.82909
6 1 2.0 0.403902 1.12182 0.798016
7 1 2.0 3.14169 -0.521153 0.364154
8 2 -2.0 -0.331894 -0.65025 -0.154732
9 2 -2.0 1.70509 -1.90609 -0.267181
10 2 -2.0 1.69075 0.434366 -0.764456
11 2 -2.0 -2.16109 1.35301 -0.0741886
12 2 -2.0 -0.517414 -0.320352 2.01812
13 2 -2.0 1.52574 -0.538064 1.60496
14 2 -2.0 2.42682 1.26107 1.018
Я пытался:
with open(XYZ, 'r') as f:
for i, line in enumerate(f):
if 1 < i < 2 + int(size)*2:
cart.append(line)
cart = ''.join(cart)
with open('tmp_coord', 'w') as f:
f.write(cart)
cart_2 = []
with open('tmp_coord', 'r') as f:
lines = f.readlines()
if lines[0: 3]:
lines = ''.join(lines)
part_1 = lines.replace('Zn', '1 2.0')
if lines[4:]:
lines = ''.join(lines)
part_2 = lines.replace('O', '2 -2.0')
with open('coord', 'w') as f:
f.write(part_1)
f.write(part_2)
до сработало:
1 2.0 -0.03242693 1.01499262 1.18624963
1 2.0 -1.24072252 -1.10224569 1.27068451
1 2.0 -2.28931345 0.74183192 -0.10315717
1 2.0 -1.91262299 0.77070619 1.66444688
1 2.0 -0.66735915 -0.01841076 -0.34637875
1 2.0 0.30864204 -0.54167477 2.00936391
2 -2.0 -0.03242693 1.01499262 1.18624963
2 -2.0 -1.24072252 -1.10224569 1.27068451
2 -2.0 -2.28931345 0.74183192 -0.10315717
2 -2.0 -1.91262299 0.77070619 1.66444688
2 -2.0 -0.66735915 -0.01841076 -0.34637875
2 -2.0 0.30864204 -0.54167477 2.00936391
Однако мне не удалось поставить строку номер в начале каждой строки. И я знаю, что мой сценарий очень грязный и излишне сложный. Есть ли другой способ сделать укороченный и всеобъемлющий скрипт для той же цели?