从带有循环的表中获取信息(python)

2024-04-23 07:36:40 发布

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

  • 我试图分析这个文本文件中的一些信息(其中之一) 许多我想以相同的格式分析)

  • .txt文件中有一个表,其中包含我需要的信息

  • 该表始终有16列,但行数会有所不同

  • 表中的列由管道“|”分隔,行由以下列分隔:'+----------+----------+'

  • 我将文件(.split('+--+')拆分为一个列表('newlist'),其中 元素是一行(行1=newlist[0])

  • 考试结束后我把文件剪掉了 表结束(其中“…image::”是)
  • 现在我想把这些行分成几行 我可以轻松地使用它们的列。split(“|”)

  • 我创建了一些循环,可以很好地工作并解释一个变量 行数

  • def row()将newlist放入list\u i list\u i是一个 列出每个元素是该行中一个框的内容的位置(使用 拆分(“|”)对于这个特定的测试文件,我可以转到第(29)行

    • 我对列式数据感兴趣,下一个循环创建一个列表 with column info def column()查看范围(number)中的所有行 ,并为所有这些行提取相同的索引。so栏(9) 将第(0)[9]行、第(1)[9]行……一直拉到最后一行

    • 我的问题是,在我到达第(9)列之前,这个方法很有效,然后 显示列表索引超出范围

  • 对不起,我知道这个问题已经问了很多次了,但是我不知道怎么回事

    谢谢你!

输入文件:https://drive.google.com/open?id=0B_JDBrcvs5VcRU1ueE5kUlVoYlk

    f = open("999A.txt")


    text_in_file = f.read().strip().split('+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+')
    f.close()

    newlist = []

    for item in text_in_file:
        newlist.append(item)
    matching = [s for s in newlist if ".. image::" in s]

    for item in newlist:
        if newlist.index(item) >= newlist.index(matching[0]):
            newlist.remove(item)


    num_rows = len(newlist) - 1


    def row(i):
        row_i = newlist[i+1]
        list_i = list(row_i.strip().split('|'))
        return list_i[1:17]

    def column(i):
        list_i = []
        for z in range(num_rows):
            list_i.append(row(z)[i])
        return list_i[1:]

    for i in range(30):
        print(row(i))
    print("columns:")
    for i in range(16):
        print(column(i))

Tags: 文件intxt信息列表fordefrange
1条回答
网友
1楼 · 发布于 2024-04-23 07:36:40

The table will always have 16 columns

不正确,您只有8个头,所以您将在该行中得到一个索引错误。你知道吗

|  *L1 barcodes*  |  *L2 barcodes*  |  *L3 barcodes*  |  *L4 barcodes*  |  *L5 barcodes*  |  *L6 barcodes*  |  *L7 barcodes*  |  *L8 barcodes*  |
| CTCTCT | 27.66% | GTTTCG | 9.04%  | NNNNNN | 3.67%  | ATTCGG | 7.41%  | GACGAT | 6.90%  | GAACCC | 13.29% | GTAACA | 9.50%  | ATCGCC | 56.24% |

示例代码可以看到这一点

with open("999A.txt") as f:
    for line in f:
        line = line.strip()
        if line.startswith("|"):
            print line

如果希望只获取具有所需列数的行,则需要像这样检查拆分行的长度。你知道吗

data = []
with open("999A.txt") as f:
    for line in f:
        line = line.strip()
        if line.startswith("|"):
            cols = line.split("|")[1:-1] # remove outside empty strings
            cols = list(map(str.strip, cols)) # strip the remaining strings
            if len(cols) == 16 and not all(x == '' for x in cols):
                # keep rows with 16 columns and no empty strings
                data.append(cols)

for row in data:
    # do something
    print(row)

样本输出

['CTCTCT', '27.66%', 'GTTTCG', '9.04%', 'NNNNNN', '3.67%', 'ATTCGG', '7.41%', 'GACGAT', '6.90%', 'GAACCC', '13.29%', 'GTAACA', '9.50%', 'ATCGCC', '56.24%']
['TGTGTG', '27.54%', 'ATTCCT', '5.78%', 'TTCAGA', '3.11%', 'CGAATC', '6.70%', 'ATTCGG', '6.45%', 'TGCTGT', '13.18%', 'TGCTGT', '8.64%', 'GCTATT', '9.98%']
['ACACAC', '22.70%', 'ATGTCA', '4.47%', 'AGGTTT', '3.01%', 'GACGAT', '6.36%', 'CCATTA', '6.37%', 'TTCAGA', '12.19%', 'CCTGAG', '7.82%', 'CCGAGT', '8.79%']
['GAGAGA', '16.18%', 'GTGGCC', '4.06%', 'CCTGAG', '2.71%', 'GCTATT', '6.26%', 'TTGCCG', '6.23%', 'CCTGAG', '11.42%', 'AAGCTC', '7.77%', 'TAATAG', '5.72%']
['', '', 'GNNTNG', '3.96%', 'GAACCC', '2.47%', 'AGTAGC', '6.11%', 'TAGGCT', '6.14%', 'AGGTTT', '11.39%', 'GAACCC', '7.62%', 'CCATTA', '3.70%']
['', '', 'GTGAAA', '3.47%', '', '', 'CCATTA', '6.10%', 'GCCTAA', '6.07%', 'GTAACA', '11.36%', 'CTTAAA', '7.56%', '', '']

您可能还希望对列表中的每一对元素进行分组,以保留最初的8列

看起来是这样的

...
# keep rows with 16 columns and no empty strings
cols_iter = iter(cols)
data.append(list(zip(cols_iter, cols_iter)))

有这样的输出

[('CTCTCT', '27.66%'), ('GTTTCG', '9.04%'), ('NNNNNN', '3.67%'), ('ATTCGG', '7.41%'), ('GACGAT', '6.90%'), ('GAACCC', '13.29%'), ('GTAACA', '9.50%'), ('ATCGCC', '56.24%')]
[('TGTGTG', '27.54%'), ('ATTCCT', '5.78%'), ('TTCAGA', '3.11%'), ('CGAATC', '6.70%'), ('ATTCGG', '6.45%'), ('TGCTGT', '13.18%'), ('TGCTGT', '8.64%'), ('GCTATT', '9.98%')]

在此基础上展开,可以打印每个元素

for row in data:
    # do something
    for seq, percent in row:
        if not '' in {seq, percent}:
            print(seq, percent)

输出

CTCTCT 27.66%
GTTTCG 9.04%
NNNNNN 3.67%
ATTCGG 7.41%
GACGAT 6.90%

相关问题 更多 >