【发布时间】:2023-04-10 02:35:01
【问题描述】:
我已经下载了这个csv file,它创建了一个基因信息电子表格。重要的是在HLA-* 列中,有基因信息。如果基因的分辨率太低,例如DQB1*03 那么该行应该被删除。如果数据分辨率太高,例如DQB1*03:02:01,那么末尾的:01标签需要去掉。因此,理想情况下,我希望蛋白质采用DQB1*03:02 格式,以便在DQB1* 之后具有两个级别的分辨率。我如何告诉 python 寻找这些格式,并忽略其中存储的数据。
例如
if (csvCell is of format DQB1*03:02:01):
delete the :01 # but do this in a general format
elif (csvCell is of format DQB1*03):
delete row
else:
goto next line
更新:我引用的编辑代码
import csv
import re
import sys
csvdictreader = csv.DictReader(open('mhc.csv','r+b'), delimiter=',')
csvdictwriter = csv.DictWriter(file('mhc_fixed.csv','r+b'), fieldnames=csvdictreader.fieldnames, delimiter=',')
csvdictwriter.writeheader()
targets = [name for name in csvdictreader.fieldnames if name.startswith('HLA-D')]
for rowfields in csvdictreader:
keep = True
for field in targets:
value = rowfields[field]
if re.match(r'^\w+\*\d\d$', value):
keep = False
break # quit processing target fields
elif re.match(r'^(\w+)\*(\d+):(\d+):(\d+):(\d+)$', value):
rowfields[field] = re.sub(r'^(\w+)\*(\d+):(\d+):(\d+):(\d+)$',r'\1*\2:\3', value)
else: # reduce gene resolution if too high
# by only keeping first two alles if three are present
rowfields[field] = re.sub(r'^(\w+)\*(\d+):(\d+):(\d+)$',r'\1*\2:\3', value)
if keep:
csvdictwriter.writerow(rowfields)
【问题讨论】:
-
您是否尝试过正则表达式来匹配格式?这听起来像是可以通过映射和过滤器,使用正则表达式来完成的事情。用于查找模式的正则表达式,用于删除 :01 的映射和用于删除行的过滤器。
-
另外,你能提供一个小的输入和所需的输出吗?不是每个人都希望浏览链接并通过 Excel 电子表格进行挖掘以填写内容。
-
@user1161318 我将如何编写这行正则表达式来完成此操作?
-
@user1876508:查看此链接,了解有关 Python 正则表达式的信息:docs.python.org/2/library/re.html
-
我可以看到您添加的代码存在一些问题。值得注意的是:使用
open()调用打开两个文件,并在阅读器上使用'rb'模式,在编写器上使用'wb'。在正则表达式中,将(\w+)更改为(\w)。
标签: python csv formatting bioinformatics