使用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
组合文件引用