使用拆分方法在Python中保留空白字段

时间:2017-08-22 16:55:05

标签: python

我有一个制表符分隔文件,其条目如下所示:

strand1       strand2        genename        ID 
AGCTCTG        AGCTGT           Erg1          ENSG010101

但是,其中一些字段有空白字段,例如:

strand1       strand2         genename         ID 
AGCGTGT        AGTTGTT                         ENSG12955729

当我读到python中的行时:

data = [line.strip().split() for line in filename]

第二个例子被折叠成3个索引的列表:

['AGCGTGT', 'AGTTGTT', 'ENSG12955729'] 

我希望保留空字段,以便第二个示例成为4个索引的列表:

['AGCGTGT', 'AGTTGTT', '', 'ENSG12955729'] 

我该怎么做?

5 个答案:

答案 0 :(得分:2)

您可以在标签上明确拆分:

>>> "foo\tbar\t\tbaz".split('\t')
['foo', 'bar', '', 'baz']

默认情况下,split()将分割任意数量的空格。

除非您能确保第一列和最后一列不为空,否则strip()会导致问题。如果数据格式良好,此解决方案将起作用。

如果您知道唯一的选项卡是字段分隔符,并且您仍想从各个列值中删除其他空格(空格):

map(str.strip, line.split('\t'))

答案 1 :(得分:1)

如果您未向str.split()方法提供参数,则会将任何连续的空白字符序列视为单个分隔符。当你给它一个参数.split('\t')时,它可能会将该字符串的每个单独实例视为一个分隔符。

答案 2 :(得分:1)

正如其他人所说,你可以明确地拆分标签,但你仍然需要清理行结尾。

最好使用处理分隔文件的csv module

import csv
with open('filename.txt', newline='') as f:
    reader = csv.reader(f, delimiter='\t')
    headers = next(reader)
    data = list(reader)

答案 3 :(得分:0)

不带任何参数的Split方法将连续的空格流视为单个字符,因此它会分割所有数量的空格。您需要为方法指定argumnet,在您的情况下为\ t。

答案 4 :(得分:0)

我总是在寻找可以应用pyparsing的谜题,无论结果多么不切实际。如果不出意外,我总是可以查看我的旧答案,看看我尝试了什么。

不要太严厉地评价我。 :)

import pyparsing as pp
item = pp.Word(pp.alphanums) | pp.Empty().setParseAction(lambda x: '')
TAB = pp.Suppress(r'\t')
process_line = pp.Group(item('item') + TAB + item('item') + TAB + item('item') + TAB + item('item'))

with open('tab_delim.txt', 'rb') as tabbed:
    while True:
        line = tabbed.readline()
        if line:
            line = line.decode().strip().replace('\t', '\\t' )+3*'\\t'
            print (line.replace('\\t', ' '))
            print('\t', process_line.parseWithTabs().parseString(line))
        else:
            break

输出:

strand1 strand2 genename ID   
     [['strand1', 'strand2', 'genename', 'ID']]
AGCTCTG AGCTGT Erg1 ENSG010101   
     [['AGCTCTG', 'AGCTGT', 'Erg1', 'ENSG010101']]
AGCGTGT AGTTGTT  ENSG12955729   
     [['AGCGTGT', 'AGTTGTT', '', 'ENSG12955729']]
ABC DEF   
     [['ABC', 'DEF', '', '']]

编辑:将行TAB = pp.Suppress(r'\t')改为PaulMcG在评论中建议的内容(来自非原始字符串中't'前面的双斜杠的构造)。