使用Python查找多个单词并打印下一行

2024-10-01 09:23:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的文本文件。它看起来如下

> <Enzymologic: Ki nM 1>
 257000

> <Enzymologic: IC50 nM 1>
n/a

> <ITC: Delta_G0 kJ/mole 1>
n/a

> <Enzymologic: Ki nM 1>
5000

> <Enzymologic: EC50/IC50 nM 1>
1000

.....

现在我想创建python脚本来查找像(> <Enzymologic: Ki nM 1>> <Enzymologic: EC50/IC50 nM 1>)这样的单词,并以制表符分隔的格式打印每个单词的下一行,如下所示

^{pr2}$

我试着遵循代码

infile = path of the file
lines = infile.readlines()
infile.close()
searchtxt = "> <Enzymologic: IC50 nM 1>", "> <Enzymologic: Ki nM 1>"
for i, line in enumerate(lines): 
     if searchtxt in line and i+1 < len(lines):
         print lines[i+1]

但是它不起作用,任何人都可以建议一些代码…来实现它。在

提前谢谢


Tags: 代码inline单词infiledeltalines文本文件
3条回答

你真的有太多不同的问题:

解析文件并从中提取数据

import itertools

# let's imitate a file
pseudo_file = """
> <Enzymologic: Ki nM 1>
 257000

> <Enzymologic: IC50 nM 1>
n/a

> <ITC: Delta_G0 kJ/mole 1>
n/a

> <Enzymologic: Ki nM 1>
5000

> <Enzymologic: EC50/IC50 nM 1>
1000
""".split('\n')

def iterate_on_couple(iterable):
  """
    Iterate on two elements, by two elements
  """
  iterable = iter(iterable)
  for x in iterable:
    yield x, next(iterable)

plain_lines = (l for l in pseudo_file  if l.strip()) # ignore empty lines

results = {}

# store all results in a dictionary
for name, value in iterate_on_couple(plain_lines):
  results.setdefault(name, []).append(value)

# now you got a dictionary with all values linked to a name
print results

现在这段代码假设你的文件没有被破坏 你总是有这样的结构:

  • 空白
  • 姓名
  • 价值

如果没有,你可能需要更坚固的东西。在

其次,它将所有值存储在内存中,如果 你有很多价值观。如果是这样的话,你需要考虑一些存储空间 解决方案,例如shelve模块或sqlite。在

将结果保存到文件中

^{pr2}$

因为我正在为您编写整个代码,所以我仔细地使用了一些高级Python习惯用法,这样您在使用它时会有一些值得思考的东西。在

我认为你的问题是因为你做了if searchtxt in line,而不是对你的pattern中的每个searchtxt做{}。我要做的是:

>>> path = 'D:\\temp\\Test.txt'
>>> lines = open(path).readlines()
>>> searchtxt = "Enzymologic: IC50 nM 1", "Enzymologic: Ki nM 1"
>>> from collections import defaultdict
>>> dict_patterns = defaultdict(list)
>>> for i, line in enumerate(lines):
    for pattern in searchtxt:
        if pattern in line and i+1 < len(lines):
             dict_patterns[pattern].append(lines[i+1])

>>> dict_patterns
defaultdict(<type 'list'>, {'Enzymologic: Ki nM 1': ['257000\n', '5000\n'],
                            'Enzymologic: IC50 nM 1': ['n/a\n', '1000']})

dict的使用允许按模式对结果进行分组(defaultdict是一种不必强制初始化对象的方便方法)。在

s = '''Enzymologic: Ki nM 1

257000

Enzymologic: IC50 nM 1

n/a

ITC: Delta_G0 kJ/mole 1

n/a

Enzymologic: Ki nM 1

5000

Enzymologic: IC50 nM 1

1000'''
from collections import defaultdict

lines = [x for x in s.splitlines() if x]
keys = lines[::2]
values = lines[1::2]
result = defaultdict(list)
for key, value in zip(keys, values):
    result[key].append(value)
print dict(result)

>>> {'ITC: Delta_G0 kJ/mole 1': ['n/a'], 'Enzymologic: Ki nM 1': ['257000', '5000'], 'Enzymologic: IC50 nM 1': ['n/a', '1000']}

然后根据需要格式化输出。在

相关问题 更多 >