【问题标题】:How can I parse this text into a table in Python?如何将此文本解析为 Python 中的表格?
【发布时间】:2018-10-31 15:25:20
【问题描述】:

我有这个名为 text.txt 的数据。我也有下面的代码。我想提取行值并想用它制作一个表格。我也想看看有没有更好的方法。谢谢

test.txt

Counting********************File:  bbduk_trimmed_Ago2_SsHV2L_1_CATGGC_L003_R1_001
Seq_132582_1: ATCCGAATTAGTGTAGGGGTTAACATAACTCT: 
0
Seq_483974_49238: TCCGAATTAGTGTAGGGGTTAACATAACTC: 
73764
Counting********************File:  bbduk_trimmed_Ago2_SsHV2L_2_CATTTT_L003_R1_001
Seq_132582_1: ATCCGAATTAGTGTAGGGGTTAACATAACTCT: 
0
Seq_483974_49238: TCCGAATTAGTGTAGGGGTTAACATAACTC: 
78640
Counting********************File:  bbduk_trimmed_Ago2_VF_1_CAACTA_L003_R1_001.fastq
Seq_132582_1: ATCCGAATTAGTGTAGGGGTTAACATAACTCT: 
0
Seq_483974_49238: TCCGAATTAGTGTAGGGGTTAACATAACTC: 
26267

我想要的结果:

  File Name                                 Seq_132582_1  Seq_483974_49238
0  bbduk_trimmed_Ago2_SsHV2L_1_CATGGC_L003_R1_001     0      73764
1  bbduk_trimmed_Ago2_SsHV2L_2_CATTTT_L003_R1_001     0      78640
2  bbduk_trimmed_Ago2_VF_1_CAACTA_L003_R1_001.fastq   0      26267

我试过的代码:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")
import re
import pandas as pd
text = open("text.txt",'r').read()
print(type(text))
results = re.findall(r'(bbduk_trimmed.*.fastq)\nSeq_132582_1: ATCCGAATTAGTGTAGGGGTTAACATAACTCT: \n(\d)\nSeq_483974_49238: TCCGAATTAGTGTAGGGGTTAACATAACTC: \n(\d*)',text)
df=pd.DataFrame(results)
# df.columns=['FileName','Seq_132582_1','Seq_483974_49238'] #This doesn't work
print(df)

【问题讨论】:

    标签: python text-parsing


    【解决方案1】:

    只需将您的正则表达式替换为以下代码行:

    re.findall(r'Counting[*]+File:[ ]*([\w.]+)[ \n]*[ :\w]+[\n]*(\w+)[\n]*[ :\w]+[\n]*(\w+)', text)
    

    说明:

    • [*]+ - 匹配一个或多个 * 字符
    • [ ]* - 匹配一个或多个 (空格)字符
    • ([\w.]+) - 匹配文件名并作为第一个 paranthasis 计算
    • [ \n]* - 匹配零个或多个空格或换行符
    • [ :\w]+ - 匹配以Seq 开头的整行

    在正则表达式中获取序列的核心逻辑如下:

    ([\w.]+)[ \n]*[ \w]+:[ :\w]+[\n]*(\w+)

    • 首先将文件名与([\w.]+) 匹配后,我们使用[ \n]* 匹配空格和新行,
    • 之后,如果你想解析你正在解析的序列的名称,你可能需要单独保留[ \w]+:[ :\w]+并将其用作([ \w])+:[ :\w]+,paranthisis可以匹配你可以提取序列,可以是Seq_132582_1Seq_483974_49238 , 但是如果不考虑顺序,那么您可以简单地将其替换为 [ :\w]+[\n]* 并匹配整行并将下一行所需的数据与 (\w+) 匹配

    另一种更简单的方法是在不使用re模块的情况下提取数据以准备结果如下所示:

    results = []
    f = open("content.txt", 'r')
    
    while True:
        line = f.readline()
        if not line:
            break
        file_name = line.split(":")[-1].strip()
        f.readline()  # skip line 
        data_seq1 = f.readline().strip()
        f.readline()  # skip line 
        data_seq2 = f.readline().strip()
        results.append((file_name, data_seq1, data_seq2))
    

    【讨论】:

    • 谢谢!如果我有更多的 Seq 怎么办?我需要添加什么正则表达式?
    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2021-08-04
    相关资源
    最近更新 更多