Извлечение позиций из списка (Python) - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть файл .xyz H2S, и если я читаю файл следующим образом:

with open('H2S.xyz','r') as stream:
for line in stream:
    print(line)

Я получаю это:

3

XYZ file of the hydrogen sulphide molecule

S                  0.00000000    0.00000000    0.10224900

H                  0.00000000    0.96805900   -0.81799200

H                  0.00000000   -0.96805900   -0.81799200

В первой строке указано количество атомова последние 3 строки - координаты этих атомов.

Я должен написать некоторый код для извлечения позиции каждого атома в молекуле в виде списка, где каждый элемент представляет собой другой список с атомом.координаты.

Если я сделаю это:

with open('H2S.xyz','r') as stream:
new=list(stream)
new

Я получу каждую строку как элемент в списке, и если я сделаю это:

with open('H2S.xyz','r') as stream:
new_list=[]
for line in stream:
    new_list=new_list+line.split()
new_list

Я получу каждуюэлемент отдельно:

['3','XYZ','file','of','the','hydrogen','sulphide','molecule','S',
'0.00000000','0.00000000','0.10224900','H','0.00000000','0.96805900',
'-0.81799200','H','0.00000000','-0.96805900','-0.81799200']

Что я не хочу.Список, который я хочу, выглядит следующим образом:

[['0.00000000','0.00000000','0.10224900'],
['0.00000000','0.96805900','-0.81799200'],
['0.00000000','-0.96805900','-0.81799200']]

Но я не уверен, как его кодировать.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Я бы сделал что-то вроде:

import re
with open("file.txt", "r") as f: 
    print([re.split(r"\s+", x.strip(), 3) for x in f if len(re.split(r"\s+", x, 3)) == 4])

[['S', '0.00000000', '0.00000000', '0.10224900'], ['H', '0.00000000', '0.96805900', '-0.81799200'], ['H', '0.00000000', '-0.96805900', '-0.81799200']]
0 голосов
/ 30 ноября 2018

Считать все строки файла .xyz, разделить элемент и позиции и добавить позиции в список.

H2S.xyz

    3
XYZ file of the hydrogen sulphide molecule
    S       0.00000000      0.00000000      0.10224900
    H       0.00000000      0.96805900     -0.81799200
    H       0.00000000     -0.96805900     -0.81799200

Код

with open('H2S.xyz') as data:
    lines=data.readlines()                  # read all lines
    new_list = []
    for atom in lines[2:]:                  # start from third line
        position = atom.split()             # get the values
        new_list.append(position[1:])       # append only the the positions

print(new_list)

Ваш список

[['0.00000000', '0.00000000', '0.10224900'],
['0.00000000', '0.96805900', '-0.81799200'],
['0.00000000', '-0.96805900', '-0.81799200']]
0 голосов
/ 29 ноября 2018

Эта функция должна дать вам правильный вывод.

def parse_xyz(file_name):

    output = []
    with open(file_name) as infile:
        data = infile.readlines()
        for row in data[2:]: # Throw away the first few lines
            if row[1:]: # Throw away the first column
                output.append(row[1:].split())
    return output


result = parse_xyz('h2s.xyz')
print(result)

Несколько замечаний о том, что она делает:

  1. Сначала я обернул код в функцию.Это, как правило, предпочтительнее, поскольку это означает, что вы можете повторить процесс с другими файлами, например result = parse_xyz('h2o.xyz')
  2. for row in data[2:]: - это нарезка списка , поэтому мы не начинаем собирать какие-либо результаты для нескольких начинающихlines.
  3. Мы повторяем запись среза во вложенном цикле for, что эквивалентно выбрасыванию первых символов строки, которые вы хотите записать.
...