Python读取sdf/mdl坐标: How to read until two spaces are met?

标签 python string list file format

我想读取一些 .sdf 文件(实际上是 .mdl 文件,但当我下载它们时它们显示为 .sdf),以便制作一个程序将它们更改为另一种格式。 .sdf 文件模拟分子,但这与那里无关。
我想阅读忘记债券的坐标,所以我需要从这样的文件格式:

ALA
  CCTOOLS-0424210918

 13 12  0  0  1  0  0  0  0  0999 V2000
    2.2810   26.2130   12.8040 N   0  0  0  0  0
    1.1690   26.9420   13.4110 C   0  0  0  0  0
    1.5390   28.3440   13.8740 C   0  0  0  0  0
    2.7090   28.6470   14.1140 O   0  0  0  0  0
    0.6010   26.1430   14.5740 C   0  0  0  0  0
    0.5230   29.1940   13.9970 O   0  0  0  0  0
    2.0330   25.2730   12.4930 H   0  0  0  0  0
    3.0800   26.1840   13.4360 H   0  0  0  0  0
    0.3990   27.0670   12.6130 H   0  0  0  0  0
   -0.2470   26.6990   15.0370 H   0  0  0  0  0
    0.3080   25.1100   14.2700 H   0  0  0  0  0
    1.3840   25.8760   15.3210 H   0  0  0  0  0
    0.7530   30.0690   14.2860 H   0  0  0  0  0
  1  2  1  0  0  0
  1  7  1  0  0  0
  1  8  1  0  0  0
  2  3  1  0  0  0
  2  5  1  0  0  0
  2  9  1  0  0  0
  3  4  2  0  0  0
  3  6  1  0  0  0
  5 10  1  0  0  0
  5 11  1  0  0  0
  5 12  1  0  0  0
  6 13  1  0  0  0
M  END
$$$$

我想从第 3 行开始阅读,直到数字前只有 2 个空格。
如果你:
file=open('ALA_model.sdf',mode="r")
string_list=file.readlines()
file.close()
datasplit=[]
for i in range(len(string_list)):
   datasplit.append(string_list[i].split(" "))
(快速提醒:ALA_model.sdf 是上面文件的名称,但不是我必须处理的唯一文件。请随意使用上面的 ALA 文件,因为我是从 http://ligand-expo.rcsb.org/reports/A/ALA/ALA_model.sdf 下载的)
你会发现
 datasplit[3]=['', '13', '12', '', '0', '', '0', '', '1', '', '0', '', '0', '', '0', '', '0', '', '0999', 'V2000\n']
这将意味着开始阅读。然后我们有:
datasplit[4]=['', '', '', '', '2.2810', '', '', '26.2130', '', '', '12.8040', 'N', '', '', '0', '', '0', '', '0', '', '0', '', '0\n']
我只需要前三个数字和字母/原子,但我可以自己处理。
最后但并非最不重要的,
datasplit[17]=['', '', '1', '', '2', '', '1', '', '0', '', '0', '', '0\n']
是我不想读的第一行。
那么当列表中的前两个 str 对象是空格字符串时,我该如何停止阅读?
我相信它会来自 string_list[4:16] 在这唯一的情况下,但我有其他 .sdf 文件要读取,每个文件都有不同的长度,我想从中构建一个函数,使您知道的可迭代,无需编写脚本对于每个。
综上所述,在不关心格式的情况下,我们如何遍历一个列表,其中三个/四个第一个字符串值是空格,直到第三个字符串值变成一个数字?

最佳答案

另一种选择可能是使用 file.read() 读取整个文件。 , 并重复匹配以 3 个或更多空格开头的所有行,后跟可选的 -和使用模式的数字。

^ {3,}-?\d.*(?:\r?\n {3,}-?\d.*)*
  • ^字符串开头
  • {3,}-?\d.*匹配 3 个或更多空格,可选 - , 一个数字和该行的其余部分
  • (?:\r?\n {3,}-?\d.*)* (可选)再次重复换行符和相同的模式

  • Regex demo
    那么你可以使用splitlines()split()每行,将前 4 项附加到 datasplit .
    例如
    import re
    from pprint import pprint
    
    file = open('ALA_model.sdf', mode="r")
    content = file.read()
    file.close()
    match = re.search(r"^ {3,}-?\d.*(?:\r?\n {3,}-?\d.*)*", content, re.M)
    datasplit = []
    
    if match:
        for line in match.group().splitlines():
            datasplit.append([part for part in line.split()][:4])
    
    pprint(datasplit)
    
    输出
    [['2.2810', '26.2130', '12.8040', 'N'],
     ['1.1690', '26.9420', '13.4110', 'C'],
     ['1.5390', '28.3440', '13.8740', 'C'],
     ['2.7090', '28.6470', '14.1140', 'O'],
     ['0.6010', '26.1430', '14.5740', 'C'],
     ['0.5230', '29.1940', '13.9970', 'O'],
     ['2.0330', '25.2730', '12.4930', 'H'],
     ['3.0800', '26.1840', '13.4360', 'H'],
     ['0.3990', '27.0670', '12.6130', 'H'],
     ['-0.2470', '26.6990', '15.0370', 'H'],
     ['0.3080', '25.1100', '14.2700', 'H'],
     ['1.3840', '25.8760', '15.3210', 'H'],
     ['0.7530', '30.0690', '14.2860', 'H']]
    
    Python demo

    关于Python读取sdf/mdl坐标: How to read until two spaces are met?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67320397/

    相关文章:

    c - 基于\0 终止的循环无法正常工作?

    python - 在 Python 中模拟列表

    java - 根据另一个列表的顺序对列表进行排序

    Python-删除同一索引处多个子列表的元素

    python - 在您的应用程序中识别 “sensitive”代码

    python - 如何使用sys.callstats?

    python - 如何自动化我的 Python 代码?

    python - 排序 Swagger 标签

    regex - 使用 grepl 从模式列表中查找匹配模式

    java - 如何从java中的字符串列表中删除最后3个字符?