如何将此文本解析为 Python 中的 table?
How can I parse this text into a table in Python?
我有这个数据叫做 text.txt。我的代码也如下。我想提取行值并想用它制作 table 。我也想看看是否有更好的方法来做到这一点。谢谢
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)
只需将您的正则表达式替换为以下代码行:
re.findall(r'Counting[*]+File:[ ]*([\w.]+)[ \n]*[ :\w]+[\n]*(\w+)[\n]*[ :\w]+[\n]*(\w+)', text)
解释:
[*]+
- 匹配一个或多个 *
字符
[ ]*
- 匹配一个或多个 </code> (space) 字符</li>
<li><code>([\w.]+)
- 匹配文件名并计算为第一个paranthasis
[ \n]*
- 匹配零个或多个 space 或换行符
[ :\w]+
- 匹配以 Seq
开头的整行
正则获取序列的核心逻辑如下:
([\w.]+)[ \n]*[ \w]+:[ :\w]+[\n]*(\w+)
- 首先将文件名与
([\w.]+)
匹配后,我们使用 [ \n]*
、 匹配 space(s) 和新行
- 之后,如果你想解析你正在解析的序列的名称,你可能需要单独保留
[ \w]+:[ :\w]+
并将其用作 ([ \w])+:[ :\w]+
paranthisis 可以匹配的地方你可以提取可以是 Seq_132582_1
或 Seq_483974_49238
,但是如果不考虑顺序,那么您可以简单地将其替换为 [ :\w]+[\n]*
并匹配整行并将下一行所需的数据与 [=27= 匹配]
另一个更简单的方法是提取数据如下所示,以在不使用 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))
我有这个数据叫做 text.txt。我的代码也如下。我想提取行值并想用它制作 table 。我也想看看是否有更好的方法来做到这一点。谢谢
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)
只需将您的正则表达式替换为以下代码行:
re.findall(r'Counting[*]+File:[ ]*([\w.]+)[ \n]*[ :\w]+[\n]*(\w+)[\n]*[ :\w]+[\n]*(\w+)', text)
解释:
[*]+
- 匹配一个或多个*
字符[ ]*
- 匹配一个或多个</code> (space) 字符</li> <li><code>([\w.]+)
- 匹配文件名并计算为第一个paranthasis[ \n]*
- 匹配零个或多个 space 或换行符[ :\w]+
- 匹配以Seq
开头的整行
正则获取序列的核心逻辑如下:
([\w.]+)[ \n]*[ \w]+:[ :\w]+[\n]*(\w+)
- 首先将文件名与
([\w.]+)
匹配后,我们使用[ \n]*
、 匹配 space(s) 和新行
- 之后,如果你想解析你正在解析的序列的名称,你可能需要单独保留
[ \w]+:[ :\w]+
并将其用作([ \w])+:[ :\w]+
paranthisis 可以匹配的地方你可以提取可以是Seq_132582_1
或Seq_483974_49238
,但是如果不考虑顺序,那么您可以简单地将其替换为[ :\w]+[\n]*
并匹配整行并将下一行所需的数据与 [=27= 匹配]
另一个更简单的方法是提取数据如下所示,以在不使用 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))