首页 > 解决方案 > 如何将此文本解析为 Python 中的表格?

问题描述

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

测试.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)

标签: pythontext-parsing

解决方案


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

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+)

  • 在将文件名与 first 匹配后,我们使用,([\w.]+)匹配空格和新行[ \n]*
  • 之后,如果你想解析你正在解析的序列的名称,你可能需要[ \w]+:[ :\w]+单独保存并将它用作([ \w])+:[ :\w]+paranthisis 可以匹配的位置,你可以提取可以是Seq_132582_1or的序列Seq_483974_49238,但是如果不考虑顺序,那么你可以简单地替换它with[ :\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))

推荐阅读