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

使用Split方法在Python中保留空白字段,python,Python,我有一个以制表符分隔的文件,其中的条目如下所示: strand1 strand2 genename ID AGCTCTG AGCTGT Erg1 ENSG010101 但是,其中一些字段为空,例如: strand1 strand2 genename ID AGCGTGT AGTTGTT ENSG

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

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'] 

如何执行此操作?

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

当您不给
str.split()
方法一个参数时,它会将任何连续的空白字符序列视为一个分隔符。当您给它一个参数时,
.split('\t')
可能会将该字符串的每个实例作为分隔符。

您可以在选项卡上显式拆分:

>>> "foo\tbar\t\tbaz".split('\t')
['foo', 'bar', '', 'baz']
默认情况下,
split()

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

如果您知道仅有的选项卡是字段分隔符,并且仍然希望从各个列值周围去除其他空白(空格):

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

您可以在选项卡上显式拆分:

>>> "foo\tbar\t\tbaz".split('\t')
['foo', 'bar', '', 'baz']
默认情况下,
split()

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

如果您知道仅有的选项卡是字段分隔符,并且仍然希望从各个列值周围去除其他空白(空格):

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

正如其他人所说,您可以在选项卡上显式拆分,但仍然需要清理行尾

更好的方法是使用处理分隔文件的:

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

正如其他人所说,您可以在选项卡上显式拆分,但仍然需要清理行尾

更好的方法是使用处理分隔文件的:

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

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

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

我一直在寻找可以应用pyparsing的谜题,无论结果可能多么不切实际。如果没有别的,我总是可以通过我的旧答案来看看我尝试了什么

不要对我太苛刻。:)

输出:

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”之前带有双斜杠的结构)。

我一直在寻找可以应用pyparsing的谜题,无论结果可能多么不切实际。如果没有别的,我总是可以通过我的旧答案来看看我尝试了什么

不要对我太苛刻。:)

输出:

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”之前带有双斜杠的结构)。

是的,我将编辑以删除
strip()
,因此它更通用。这完全取决于数据的格式是否正确,不一定是一个完美的解决方案。是的,我将进行编辑以删除
strip()
,因此它更通用。这完全取决于数据格式是否正确,不一定是一个完美的解决方案。很好-由于制表符在这里很重要,您可以使用
parseRelation.setDefaultWhitespaceChars(“”)
从默认空白字符中删除它们。对于包含重要
\
字符的字符串(即禁止Python解释器将“\t”转换为),请使用原始字符串文本:
r'\t'
。它们被添加到Python中,以使正则表达式更易于输入,但在这里也可以使用。自从我升级到Python3.5以来,我爱上了stdlib的
pathlib.Path
类,该类用于读/写短文件,使用
Path(some\u目录)/filename\u str
组合文件引用。我尝试了各种方法来生成用于制表符工作的原始字符串文本。我只想说,成功是难以捉摸的如果你看看我的一些答案,你会发现我也一直在为pathlib传道。让我们结束与
listdir
walk
glob
的斗争吧!PS:我愿意为选项卡提供一个示例。我指的是您的
'\\t'
字符串,您可以将其写成
r'\t'
。我无法想象在原始字符串文字中嵌入制表符或换行符的方法,因为关键是不要解释反斜杠,而是将其逐字保留。@PaulMcG:根据我对您的评论的理解进行了更改。很好-因为制表符在这里很重要,您可以使用
parseRelation.setDefaultWhitespaceChars(“”)
从默认空白字符中删除它们。对于包含重要
\
字符的字符串(即禁止Python解释器将“\t”转换为),请使用原始字符串文本:
r'\t'
。它们被添加到Python中,以使正则表达式更易于输入,但在这里也可以使用。自从我更新到Python3.5之后,我爱上了stdlib的
pathlib.Path
类,该类用于读/写短文件,使用
Path(some目录)/filename\u str
组合文件引用