如何在Python中将此文本解析为表?

2024-06-28 21:30:35 发布

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

我把这些数据称为文本.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

我想要的结果是:

^{pr2}$

我试过的代码:

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)

Tags: 代码textimporttxtdfseqfiler1
2条回答

只需将regex替换为以下代码行:

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

说明:

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

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

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

  • 首先用([\w.]+)匹配文件名之后,我们使用[ \n]*匹配空格和新行
  • 之后,如果你想解析你正在解析的序列的名称,你可能需要分别保留[ \w]+:[ :\w]+,并将其作为([ \w])+:[ :\w]+在偏执症可以匹配的地方,你可以提取序列,它可以是Seq_132582_1或{},但是如果不考虑顺序,则可以简单地用[ :\w]+[\n]*替换它,并匹配整行并匹配使用(\w+)在下一行中需要的数据

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

^{pr2}$

对于您的特定文本文件,可以如下进行解析:

text = re.sub(':\s\n', ':', text)  # normalize lines

lines = []
lines = text.split('\n')

i = 0
table_rows = []

while (i < len(lines)):

    table_rows.append([str(lines[i].split(':')[1]).strip(),
                       str(lines[i+1].split(':')[2]).strip(),
                       str(lines[i+2].split(':')[2]).strip()])

    i+=3


df = pd.DataFrame(table_rows)

df = df.rename({0:'File Name',
                1:str(lines[1].split(':')[0]).strip(),
                2:str(lines[2].split(':')[0]).strip()}, axis=1)

相关问题 更多 >