【问题标题】:creating list from separated lines从分隔行创建列表
【发布时间】:2013-08-21 21:02:02
【问题描述】:

我的数据如下所示:

-HI5UHB101EPGLJ rank=0000024 x=1813.0 y=437.0 length=81
ACGTAGATCGTGTAGCTGAGGATGTTGACAACCATGTGGACAGAGCCTCACCATCAACAT
CCTCAGCTACACGATCTGCGT
-HI5UHB101BDVPE rank=0000032 x=451.5 y=48.0 length=73
ACGTAGATCGTCTTGAGTGATTACAGATCTAATACAATGTGCAGTCTAGCTAGATGTTAT
TCTATATATATAC
-HI5UHB101AL8KC rank=0000049 x=136.0 y=586.0 length=58
ACGTAGATCGTCTCGGCTAGTAGACGAGCCATCGTCTACTAGCCGAGACGATCTGCGT

如何将其制成如下所示的 csv 表:

'HI5UHB101EPGLJ', 'rank=0000024', 'x=1813.0', 'y=437.0', 'length=81','ACGTAGATCGTGTAGCTGAGGATGTTGACAACCATGTGGACAGAGCCTCACCATCAACATCCTCAGCTACACGATCTGCGT'
'HI5UHB101BDVPE', 'rank=0000032', 'x=451.5', 'y=48.0', 'length=73', 'ACGTAGATCGTCTTGAGTGATTACAGATCTAATACAATGTGCAGTCTAGCTAGATGTTATTCTATATATATAC'
'HI5UHB101AL8KC', 'rank=0000049', 'x=136.0', 'y=586.0', 'length=58', 'ACGTAGATCGTCTCGGCTAGTAGACGAGCCATCGTCTACTAGCCGAGACGATCTGCGT'

我的主要问题是“长度”之后有一个换行符(\n),然后当我需要它们加入时,字母序列本身在它们之间有换行符(\n)。 字母序列有不同的长度,导致序列行数可变。

任何帮助将不胜感激。这将在一个巨大的文件上运行。

【问题讨论】:

  • json 似乎是一种更自然的序列化格式,不是吗?
  • @roippi:为什么? CSV 完全可用。
  • 您可能会发现 Biopython 库很有用,尤其是 SeqIO:biopython.org/wiki/SeqIO 我不能立即识别您的格式,但如果它是标准格式,那么该库中可能有工具可以读取它。
  • 请提供示例代码!
  • @MartijnPieters 他的属性已经命名,耸耸肩。如果他将来需要操作序列化的数据,他会通过使用 csv 为自己做更多的工作。过去没有什么“错”。

标签: python list csv


【解决方案1】:

使用生成器函数通过起始- 检测新条目:

def per_section(iterable):
    row = []
    for line in iterable:
        if line.startswith('-'):
            if row:
                yield row
            row = line[1:].split() + ['']
        else:
            row[-1] += line.strip()
    if row:
        yield row

这会产生完整的重组部分,准备写入 CSV。

with open(inputfile) as infile, open(outputfile, 'wb') as outfile:
    csvwriter = csv.writer(outfile)
    csvwriter.writerows(per_section(infile))

对于您的示例输入,会产生:

HI5UHB101EPGLJ,rank=0000024,x=1813.0,y=437.0,length=81,ACGTAGATCGTGTAGCTGAGGATGTTGACAACCATGTGGACAGAGCCTCACCATCAACATCCTCAGCTACACGATCTGCGT
HI5UHB101BDVPE,rank=0000032,x=451.5,y=48.0,length=73,ACGTAGATCGTCTTGAGTGATTACAGATCTAATACAATGTGCAGTCTAGCTAGATGTTATTCTATATATATAC
HI5UHB101AL8KC,rank=0000049,x=136.0,y=586.0,length=58,ACGTAGATCGTCTCGGCTAGTAGACGAGCCATCGTCTACTAGCCGAGACGATCTGCGT

【讨论】:

  • 您需要在项目周围加上单引号,并且可能在逗号后有空格。
  • @Jim:这只是 CSV 输出调整,请参阅 csv 模块文档。
  • 你不知道你让我的生活变得多么美好!谢谢!
【解决方案2】:

这样的东西应该可以工作......

f= open("data.txt")
fo = open("done.txt","w")
line = f.readline()
while(len(line) > 0):
    #print line
    if (line[0] == '-'):
        label, rank, xval, yval, lenval = line.split(" ")
        lenval = lenval.strip('\n')
        #print label,rank, xval,yval,lenval
        line2 = f.readline()
        code = line2
        line2 = f.readline()
        while( len(line2.strip()) > 0):
            code = code+line2.strip()
            line2 = f.readline()
        #print code
        lineout = "'"+label[1:]+"', '"+rank+"', '"+xval+","+yval+"', '"+lenval+"', "
        lineout = lineout+"'"+code+"'\n"
        fo.write(lineout)
    line = f.readline()
f.close()
fo.close()

【讨论】:

  • 我以为你想要第二行代码。将代码行与其他属性结合起来的 OP 练习..... :)
  • 固定以反映每条记录的单行输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多