【问题标题】:Scan through txt, append certain data to an empty list in Python扫描txt,将某些数据附加到Python中的空列表中
【发布时间】:2012-03-23 14:02:21
【问题描述】:

我有一个正在用 python 读取的文本文件。 我正在尝试从关键字后面的文本文件中提取某些元素以将它们附加到空列表中。该文件如下所示:

所以我想做两个空列表

  • 第一个列表将附加序列名称

  • 第二个列表将是一个列表列表,格式为[Bacteria,Phylum,Class,Order, Family, Genus, Species]

    大多数生物都是未培养的细菌。我正在尝试添加以下 ID 的未培养细菌;

是否有办法扫描某个单词,当找到该单词时,取其后的单词[由'\t'分隔]?

我需要它来创建要翻译成分类数据的序列名称字典。

我知道我需要一个空列表来将名称附加到:

seq_names=[ ]

将分类列表放入的第二个列表

taxonomy=[ ]

以及在每次迭代后重置的第三个列表

temp = [ ]

我确信它可以在 Biopython 中完成,但我正在学习我的 Python 技能

【问题讨论】:

  • 直接使用纯文本而不是图像会很有帮助。
  • 用\t分隔:list.split('\t')

标签: python list append


【解决方案1】:

是的,有办法。

您可以使用内置函数 split 将从读取文件中获得的字符串拆分为数组。从这里你可以找到你正在寻找的单词的索引,然后使用这个索引加一来获取它后面的单词。例如使用一个名为 test.text 的文本文件,看起来像这样(格式有点奇怪,因为 SO 似乎不喜欢硬制表符)。

one two three   four    five    six seven   eight   nine

以下代码

f = open('test.txt','r')

string = f.read()

words = string.split('\t')
ind = words.index('seven')
desired = words[ind+1]

将返回所需的“八”

编辑:返回列表中的每个后续单词

f = open('test.txt','r')

string = f.read()
words = string.split('\t')

desired = [words[ind+1] for ind, word in enumerate(words) if word == "seven"]

这是使用列表推导。它枚举单词列表,如果该单词是您要查找的内容,则在列表中的下一个索引处包含该单词。

Edit2:要在新行和制表符上拆分它,您可以使用正则表达式

import re
f = open('testtest.txt','r')

string = f.read()

words = re.split('\t|\n',string)

desired = [words[ind+1] for ind, word in enumerate(words) if word == "seven"]

【讨论】:

  • 感谢我让这部分工作,但它只添加了给定索引的第一个条目。我尝试使用 readlines 而不是 read 但我也无法让它以这种方式工作
  • 它适用于我所有的条目,除了最后一个。它有 '\n\n' 表示附加到 .所以如果我输入 'genus' 它会给我 'Calidilinea\n\n446584.3_2' 这是正确的答案 'Calidilinea' 但也有换行符以及下一个查询的名称 [index 0] 。 'genus' 之后的索引是重新开始之前的最后一个索引
  • 要将其拆分为两者,您可以使用正则表达式,如我的编辑所示。
【解决方案2】:

听起来您可能想要一个按序列名称索引的字典。例如,

my_data = {
           'some_sequence': [Bacteria,Phylum,Class,Order, Family, Genus, Species],
           'some_other_sequence': [Bacteria,Phylum,Class,Order, Family, Genus, Species]
          }

然后,您只需访问 my_data['some_sequence'] 即可提取有关该序列的数据。

要填充您的数据结构,我只需遍历文件的行,.split('\t') 将它们分成“列”,然后执行类似my_data[the_row[0]] = [the_row[10], the_row[11], the_row[13]...] 的操作将行加载到字典中。

所以,

for row in inp_file.readlines():
    row = row.split('\t')
    my_data[row[0]] = [row[10], row[11], row[13], ...]

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多