python - 如何将此文本解析为 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)
解决方案
只需用以下代码行替换您的正则表达式:
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_1
or的序列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))
推荐阅读
- html - 我的 HTML 电子邮件在桌面和 iOS Gmail 上看起来不错,但在 Android Gmail 上不好看。如何消除中间的奇怪空格?
- angular - 有没有办法在按键(输入)时触发选择事件?
- domain-driven-design - 在 DDD 中处理更新对象集合的最佳实践?
- reactjs - 为什么我的 handleChange 方法被 React 拒绝了?
- powerbi - Power BI 从列创建新行
- javascript - 如何捕获事件 win.setContentProtection() 函数触发 ElectronJS
- r - R中2列之间部分匹配的标志
- java - 我们可以根据请求参数在请求正文中添加验证吗
- c++ - cin 运算符链接以简化系统输出
- reactjs - 打字稿错误:找不到模块“react-dnd”的声明文件