【问题标题】:Searching, printing, incrementing, and outputting from a data set从数据集中搜索、打印、递增和输出
【发布时间】:2015-06-12 23:13:58
【问题描述】:

我正在努力寻找一种有效的方法来搜索文件,然后在该文件中输出特定数量的行。所以假设我有一个名为“mc_coordinates”的文件,我想从中提取信息。它详细说明了给定“步骤”处原子的坐标。该文件的组织方式如下:

         235
     INITIAL BOX 1, STEP 1
        C        12.7908790847        2.8828150218        1.1868087958
        F        11.8993427046        1.8104266120        1.3121312895
        F        13.8944796514        2.3931204072        0.4205213241
        H        12.2211496090        3.7216596131        0.7243429292
        H        13.2020314728        3.1740947812        2.1515988338
        C        12.7759828577        3.6624296172       15.2649736115
        F        11.9718262161        4.3758674409       16.1755975367
        F        12.3319038697        2.3994507343       15.0709447687
        H        12.7017245825        4.2254002044       14.2724601980
        H        13.8483690007        3.6371660190       15.6480138479

澄清:初始框(步骤号)。在每个“步骤”中,我们记录每个原子的位置。我的问题是我只对 48 的倍数的步骤感兴趣,因为这些是我有兴趣观察的坐标。所以,这意味着我必须开发以下代码:

1) 找到“INITIAL BOX 1”。

2) 取 INITAL BOX STEP # 行之前的行,在本例中为 235,然后将其除以 5 并输出此信息

3) 打印从“C”开始的每个原子坐标,直到我到达“INITIAL BOX 2”之前行中的唯一数字

4)然后我需要再次在我的文件中搜索“INITIAL BOX 49”并基本上重复步骤 2,取数字,除以 5,输出此信息,并打印/输出所有坐标,直到我到达唯一“初始框 50”之前的编号。

这个过程会重复大约 600 次。这是我目前所拥有的:

 fo = open("mc_coordinates")
 lines = fo.readlines()
 for line in lines:
        print lines.find(INITIAL)

但这给了我错误,甚至没有开始做我需要的工作。任何提示或帮助将不胜感激!谢谢! 编辑:示例输出

        47     # which is 235/5
        C        12.7908790847        2.8828150218        1.1868087958
        F        11.8993427046        1.8104266120        1.3121312895
        F        13.8944796514        2.3931204072        0.4205213241
        H        12.2211496090        3.7216596131        0.7243429292
        H        13.2020314728        3.1740947812        2.1515988338
        C        12.7759828577        3.6624296172       15.2649736115
        F        11.9718262161        4.3758674409       16.1755975367
        F        12.3319038697        2.3994507343       15.0709447687
        H        12.7017245825        4.2254002044       14.2724601980
        H        13.8483690007        3.6371660190       15.6480138479

@Bharadwa 代码生成:

  47.0
  C        12.7908790847        2.8828150218        1.1868087958
  F        11.8993427046        1.8104266120        1.3121312895
  F        13.8944796514        2.3931204072        0.4205213241
  H        12.2211496090        3.7216596131        0.7243429292
  H        13.2020314728        3.1740947812        2.1515988338
  C        12.7759828577        3.6624296172       15.2649736115
  F        11.9718262161        4.3758674409       16.1755975367
  F        12.3319038697        2.3994507343       15.0709447687
  H        12.7017245825        4.2254002044       14.2724601980
  H        13.8483690007        3.6371660190       15.6480138479
  BOX 1,  STEP 24
  C        12.4921773110        2.8286307659        1.1644437594
  F        11.6006113644        1.7562423561        1.2895557390
  F        13.5960941031        2.3384787776        0.3989045637
  H        11.9164523192        3.6676509395        0.7097873135
  H        12.9031018802        3.1199105253        2.1293308523
  C        12.4895445934        3.5818345553       14.9048344490
  F        11.6838031267        4.2949649016       15.8142975674
  F        12.0450334972        2.3193713672       14.7084532328
  H        12.4010184199        4.1124983940       13.8958289702
  H        13.5698640919        3.5405566993       15.2634094502

我需要:

  47.0
  C        12.7908790847        2.8828150218        1.1868087958
  F        11.8993427046        1.8104266120        1.3121312895
  F        13.8944796514        2.3931204072        0.4205213241
  H        12.2211496090        3.7216596131        0.7243429292
  H        13.2020314728        3.1740947812        2.1515988338
  C        12.7759828577        3.6624296172       15.2649736115
  F        11.9718262161        4.3758674409       16.1755975367
  F        12.3319038697        2.3994507343       15.0709447687
  H        12.7017245825        4.2254002044       14.2724601980
  H        13.8483690007        3.6371660190       15.6480138479
  48.0
  BOX 1,  STEP 48
  C        12.6660795715        3.6355249989       15.1210670811
  F        11.9116309909        4.3486553452       16.0735112076
  F        12.2114308249        2.3730618108       14.9494564347
  H        12.5221365040        4.1661888376       14.1184657979
  H        13.7645020294        3.5942471429       15.4196208523

【问题讨论】:

  • 这是简单的基本文本解析。让我这样说,如果我错了,请纠正我,1.每当我看到一个孤独的数字时,我将它除以 5。2.打印 INITIAL 之后以“c”开头的每一行,继续这个直到结束文件?
  • 您会在输出中得到一些随机数,因为您正在打印查找的位置。此外,没有名为 INITIAL 的变量
  • 不仅仅是“C”,还有每个原子位置,包括“F”和“H”。我想要我认为相关的“初始框”之后的每个原子坐标
  • 如果您简单地向我解释这些步骤,我可能会为您提供帮助,我不需要有关您为什么需要显示某些数据的信息,而只需告诉我您希望输出的外观如何。示例输出表示赞赏
  • 什么错误? print lines.find(INITIAL)?您希望它做什么以及为什么?

标签: python string file search


【解决方案1】:

据我理解的代码 sn-ps,有 2 个代码
1. 将打印所有原子。
2. 打印那些是STEP 变量倍数的原子。
我猜代码 2 对你的工作更有用

#[code1]

with open("mc_coordinates") as file:
    [print(str(float(line.strip())/5)) if len(line.split(' '))==1 else print(line.strip())
    for line in file if not line.strip().startswith('INITIAL')]

#[code2]

STEP = 48
Arr = []
newlines = []

with open("mc_coordinates") as file:
    for line in file:
        line = line.strip()
        if line.startswith('INITIAL'):
            continue
        if len(line.split(' '))==1:
            if Arr:
                newlines.append(Arr)
            Arr = []
            Arr.append(str(float(line)/5))
        else:
            Arr.append(line)

[print(j) for i, line in enumerate(newlines) for j in line if not i%STEP]

或者用下面的代码替换最后一行

for i, line in enumerate(newlines):
    for j in line:
        if not i%STEP:
            print(j)

【讨论】:

  • 文件“stackover.py”,第 18 行 [print(j) for i, line in enumerate(newlines) for j in line if not i%STEP] ^ SyntaxError: invalid syntax @Bharadwaj 我得到了这个错误。我不熟悉这一行的语法。你能解释一下吗?
  • 你用的是Python2.X还是3.X??
  • 我使用的是 Python 2.7.5
  • 请检查主帖,我已经添加了行
  • 这是一部出色的作品,虽然它并不完全符合我的预期。这按 24 步而不是 48 步列出所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2020-01-27
  • 2013-04-04
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
相关资源
最近更新 更多