我有一个制表符分隔文件,其条目如下所示:
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']
我该怎么做?
答案 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'前面的双斜杠的构造)。