在python中过滤CSV文件

2024-04-28 02:34:50 发布

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

我下载了这个csv file,它创建了一个基因信息的电子表格。重要的是,在HLA-*列中,有基因信息。如果基因的分辨率太低,例如DQB1*03,那么该行应该被删除。如果数据的分辨率太高,例如DQB1*03:02:01,那么需要删除末尾的:01标记。所以,理想情况下,我希望蛋白质的格式是DQB1*03:02,这样它在DQB1*之后有两个级别的分辨率。如何告诉python查找这些格式,而忽略其中存储的数据呢。 e、 g.

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

更新:我引用的已编辑代码

^{pr2}$

Tags: ofcsv数据信息formatis格式基因
2条回答

我想有些东西可以满足你的需要。它不像Peter的回答那么简单,因为它使用Python的csv模块来处理文件。它可能会被重写和简化,像他那样把文件当作纯文本来处理,但这应该很容易。在

import csv
import re
import sys

csvdictreader = csv.DictReader(sys.stdin, delimiter=',')
csvdictwriter = csv.DictWriter(sys.stdout, fieldnames=csvdictreader.fieldnames, delimiter=',')
csvdictwriter.writeheader()
targets = [name for name in csvdictreader.fieldnames if name.startswith('HLA-')]

for rowfields in csvdictreader:
    keep = True
    for field in targets:
        value = rowfields[field]
        if re.match(r'^DQB1\*\d\d$', value): # gene resolution too low?
            keep = False
            break # quit processing target fields
        else: # reduce gene resolution if too high
              # by only keeping first two alles if three are present
            rowfields[field] = re.sub(r'^DQB1\*(\d\d):(\d\d):(\d\d)$',
                                      r'DQB1*\1:\2', value)
    if keep:
        csvdictwriter.writerow(rowfields)

对我来说最困难的是决定你想做什么。在

下面是一个非常简单的过滤器:

import sys

for line in sys.stdin:
  line = line.replace( ',DQB1*03:02:01,', ',DQB1*03:02,' )

  if line.find( ',DQB1*03,' ) == -1:
    sys.stdout.write( line )

或者,如果您想使用正则表达式

^{pr2}$

把它当作

python script.py < data.csv

相关问题 更多 >