使用python从文件中读取特定行

使用python从文件中读取特定行,python,Python,我有一个包含以下数据的文件: 1xxy (1gmh) [white line] ahdkfkbbmhkkkkkyllllkkjdttyshhaggdtdyrrrutituy [white line] __________________________________________________ Intra Chain: A 32 __________________________________________________ PAIR 1

我有一个包含以下数据的文件:

   1xxy
   (1gmh)

[white line]
ahdkfkbbmhkkkkkyllllkkjdttyshhaggdtdyrrrutituy
[white line]  
   __________________________________________________
   Intra Chain:
   A 32
   __________________________________________________
   PAIR 1MNS HE 10 NM A ARG 33 OX1 3.22 32
   PAIR 1MNS UR 11 NM A ARG 33 OX2 3.21 12
   PAIR IMNS UK 32 NH A ASN 43 OZ1 5.21 22
   ...
   __________________________________________________
现在我想让它像:

   PAIR 1MNS HE 10 NM A ARG 33 OX1 3.22 32
   PAIR 1MNS UR 11 NM A ARG 33 OX2 3.21 12
   PAIR IMNS UK 32 NH A ASN 43 OZ1 5.21 22
   ...
i、 e.删除所有其他字符。 我尝试使用:

inp = open('c:/users/rox/desktop/1UMG.out','r')
for line in inp:
    if not line.strip():      # to remove excess whit lines
       continue
    else:
       z = line.strip().replace('\t',' ')
       if z.startswith('PAIR'):
          print z
inp.close()

但这段代码也没有给我任何输出。无法理解为什么
z.startswith('PAIR')
不起作用。但是直到上一行,它仍然正常。

看起来您只查看以
对开始的行,那么为什么不做一些简单的事情呢:

with open('data.txt') as infp:
   for line in infp:
      line = line.strip()
      if line.startswith('PAIR'):
         print(line)
将提供:

PAIR 1MNS HE 10 NM A ARG 33 OX1 3.22 32
PAIR 1MNS UR 11 NM A ARG 33 OX2 3.21 12
PAIR IMNS UK 32 NH A ASN 43 OZ1 5.21 22
此输出将删除前导的3个空格,如果需要,可以将它们重新添加进去


注意:将
一起使用将在您完成操作或遇到异常时自动关闭文件。

看起来您只查看以
对开始的行
,所以为什么不做这样简单的事情:

with open('data.txt') as infp:
   for line in infp:
      line = line.strip()
      if line.startswith('PAIR'):
         print(line)
将提供:

PAIR 1MNS HE 10 NM A ARG 33 OX1 3.22 32
PAIR 1MNS UR 11 NM A ARG 33 OX2 3.21 12
PAIR IMNS UK 32 NH A ASN 43 OZ1 5.21 22
此输出将删除前导的3个空格,如果需要,可以将它们重新添加进去


注意:使用
with
将在您完成操作或遇到异常时自动关闭文件。

除了@Levon的解释之外,由于文件对象支持迭代器协议,并且根据文件的大小,可以使用列表理解:

[l for l in open('test.txt') if l.startswith('PAIR')]

除了@Levon的解释之外,由于file对象支持迭代器协议,并且根据文件的大小,可以使用列表理解:

[l for l in open('test.txt') if l.startswith('PAIR')]


正则表达式签出
(r'filename.txt').read()
是否真的有效?@joel它对我来说很好。它是(r'filename.txt').read()…正则表达式签出
(r'filename.txt').read()
实际上有效吗?@joel它对我来说很好。它是(r'filename.txt')。read()…@Ovisek:错,它工作正常。在你发表这样的声明之前,至少要学习Python的基础知识。但我不喜欢它。如果你认为这是我的基本问题,那么请给我一个提示。你需要处理这个问题的前导空格,以捕捉以“PAIR”开头的行,即l.strip().startswith('PAIR')。。您还必须注意剥离尾随的
\n
(顺便说一句,我也是列表理解的忠实粉丝)@Ovisek:错了,它工作得很好。在你发表这样的声明之前,至少要学习Python的基础知识。但我不喜欢它。如果你认为这是我的基本问题,那么请给我一个提示。你需要处理这个问题的前导空格,以捕捉以“PAIR”开头的行,即l.strip().startswith('PAIR')。。您还必须注意剥离尾随的
\n
(顺便说一句,我也是列表理解的忠实粉丝)“不工作”的信息不足以处理。会发生什么?结果是什么?是否提出了例外情况?文件的大小。如果文件很大,处理和打印文件可能需要一些时间output@Ovisek:您是否看到@Levon如何使用
with
行打开文件?这类似于
infp=open('data.txt')
,但当块结束时,它会自动关闭
infp
。但是,在代码中,您从不打开任何文件,只需在文件名
inp=('c:/users/rox/desktop/1UMG.out')
本身上迭代即可。您正在迭代字符串中的字符,而不是文件中的行。(您还更改了代码,这样就不会剥离
z
,因此,如果配对前有空格,它将失败,但实际上这可能不是问题。)@Ovisek:您需要打开一个文件
inp=('c:/users/rox/desktop/1UMG.out','r')
将inp转换成两个字符串的元组,
'c:/users/rox/desktop/1UMG.out'
'r'
。因此,
对于inp中的行
然后迭代这两个字符串,这两个字符串都不是以PAIR开头的。如果出于某种原因,您不想将
行一起使用,请编写
inp=open('c:/users/rox/desktop/1UMG.out','r')
并在末尾添加一个
inp.close()
。正如我所说,您更改了Levon的代码,以便他在使用
.startswith()
之前将行剥离,但您没有,因此如果有任何前导空格,他的代码可以用,而你的代码不行。在第二个分支中添加一个“print line”(打印行),即在else之后,以确保实际正在读取这些行,并且您可能会在开始处看到空格。[顺便说一句,你有没有在Levon编写代码时尝试过?因为它应该可以工作。]“不工作”是不足以使用的信息。会发生什么?结果是什么?是否提出了例外情况?文件的大小。如果文件很大,处理和打印文件可能需要一些时间output@Ovisek:您是否看到@Levon如何使用
with
行打开文件?这类似于
infp=open('data.txt')
,但当块结束时,它会自动关闭
infp
。但是,在代码中,您从不打开任何文件,只需在文件名
inp=('c:/users/rox/desktop/1UMG.out')
本身上迭代即可。您正在迭代字符串中的字符,而不是文件中的行。(您还更改了代码,这样就不会剥离
z
,因此,如果配对前有空格,它将失败,但实际上这可能不是问题。)@Ovisek:您需要打开一个文件
inp=('c:/users/rox/desktop/1UMG.out','r')
将inp转换成两个字符串的元组,
'c:/users/rox/desktop/1UMG.out'
'r'
。因此,
对于inp中的行
然后迭代这两个字符串,这两个字符串都不是以PAIR开头的。如果出于某种原因,您不想将
行一起使用,请编写
inp=open('c:/users/rox/desktop/1UMG.out','r')
并在末尾添加一个
inp.close()
。正如我所说,您更改了Levon的代码,以便他在使用
.startswith()
之前将行剥离,但您没有,因此如果有任何前导空格,他的代码可以用,而你的代码不行。在第二个分支中添加一个“print line”(打印行),即在else之后,以确保实际正在读取这些行,并且您可能会在开始处看到空格。顺便问一下,你有没有