使用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之后,以确保实际正在读取这些行,并且您可能会在开始处看到空格。顺便问一下,你有没有