Редактирование данных / строки / списка в фрейме данных / текстовом файле - PullRequest
0 голосов
/ 04 мая 2020

У меня есть файл данных (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 

Однако мне не удалось поставить строку номер в начале каждой строки. И я знаю, что мой сценарий очень грязный и излишне сложный. Есть ли другой способ сделать укороченный и всеобъемлющий скрипт для той же цели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...