【问题标题】:Need to read specific range of text file in Python需要在 Python 中读取特定范围的文本文件
【发布时间】:2014-01-19 01:43:17
【问题描述】:

我需要在特定行之后读取一个文本文件,比如说第 100 行。该行有特定的数字,例如“255”。然后我想使用 for 循环读取接下来的 500 行。在这 500 行中,我有一些数字要提取。比如在P[3]位置。然后我需要将这些值传递到一个数组中。最后我应该有几套像下面这样。我使用以下代码来做到这一点。但我失败了。谁能帮帮我。

文件如下所示

Generated by trjconv : a bunch of waters t=   0.00000
 500
    1SOL     OW    1   1.5040   2.7580   0.6820
    2SOL     OW    4   1.5210   0.9510   2.2050

  500SOL     OW 2998   1.5310   1.7952   2.1981
   3.12736   3.12736   3.12736
Generated by trjconv : a bunch of waters t= 9000.00000
 500
    1SOL     OW    1   1.5040   2.7580   0.6820
    2SOL     OW    4   1.5210   0.9510   2.2050

  500SOL     OW 2998   1.5310   1.7952   2.1981
   3.10941   3.10941   3.10941
Generated by trjconv : a bunch of waters t=   0.00000
 500
    1SOL     OW    1   1.5040   2.7580   0.6820
    2SOL     OW    4   1.5210   0.9510   2.2050

  500SOL     OW 2998   1.5310   1.7952   2.1981
   3.12736   3.12736   3.12736
Generated by trjconv : a bunch of waters t= 9000.00000
 500
    1SOL     OW    1   1.5040   2.7580   0.6820
    2SOL     OW    4   1.5210   0.9510   2.2050

  500SOL     OW 2998   1.5310   1.7952   2.1981
   3.10941   3.10941   3.10941

我写的代码

F = open('Data.gro', 'r')
A = open('XYZ.txt', 'w')
XO = []
I = range(1,500)
for line in F:
    P = line.split()
    if P[0] == '256': # after i found this I want to read next five hundred lines.
        for R in I:
            P = line.split()
                        XO.append(P[3])
                        R +=1

    # after the for loop I want write 'XO' in to file as set 01 then should go to next P[0] == '256'

文件名“XYZ.txt”中的结果应如下所示

Set 01
X = [1.32, 4.132, 2.23, .... upto 500]
Set 02
X = [4.232, 1.162, 3.73, .... upto 500]

【问题讨论】:

  • 您不想在每个 500 次循环后将 XO 重置回 [] 吗?

标签: python file python-2.7


【解决方案1】:

您也只需要获取内部循环内的行,您可以使用next()

with open('filename') as f:
    for line in f:
       if line.split()[0] == '256':
          for _ in xrange(500):
              line = next(f)
              #do something with line

在上面的代码中,如果在条件为 True 后文件没有 500 行,您将收到 StopIteration 错误,您可以使用 try-except 处理该错误,或​​者使用itertools.islice:

from itertools import islice
with open('filename') as f:
    for line in f:
       if line.split()[0] == '256':
          XO =[line.split(None, 4)[3] for line in islice(f, 500)]
          #Write XO to a file

如果行不以前导空格开头,则可以使用@zhangxaochen 建议将line.split()[0] == '256' 部分替换为line.startswith('256 ')。另一种选择是使用line.split(None, 1)[0] == '256',它只会将行拆分一次。

【讨论】:

  • 如果文件很大,也许line.startswith('256 ') 会快一点?
  • @zhangxaochen 如果每行包含很多列并且行不包含前导空格,那么这肯定会有所帮助,否则line.split(None, 1)[0] == '256' 似乎也很好。
  • 抱歉忘记了 ;)
猜你喜欢
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2015-06-22
  • 2013-06-25
相关资源
最近更新 更多