我想在读取文件时抛出标题行。标题行以一组有限的字符串开头,但我不能在任何地方检查子字符串,因为有效的内容行可能会在字符串的后面包含一个关键字。
我无法弄清楚如何对一组子串执行line.startswith(" substring"),这是我的第一次尝试。我的意思是,我可以把它放在一个单独的部分,并根据它设置一个变量,但这是粗略的。我只想运行逻辑测试并做出相应的响应。
我已尝试过以下几种变体,因为我有很多已知的4字符开头子串,但我很确定我的语法错误,错误,错误。它解析,但它不会拒绝任何行。
cleanLines = []
line = "sample input here"
if not line[0:3] in ["node", "path", "Path"]: #skip standard headers
cleanLines.append(line)
答案 0 :(得分:2)
你的问题源于字符串切片不包括停止索引:
In [7]: line = '0123456789'
In [8]: line[0:3]
Out[8]: '012'
In [9]: line[0:4]
Out[9]: '0123'
In [10]: line[:3]
Out[10]: '012'
In [11]: line[:4]
Out[11]: '0123'
在i
和j
之间切换字符串会返回从i
开始,到(但不包括)j
结束的子字符串。
只是为了让您的代码运行得更快,您可能希望测试集合中的成员资格,而不是列表:
cleanLines = []
line = "sample input here"
blacklist = set(["node", "path", "Path"])
if line[:4] not in blacklist: #skip standard headers
cleanLines.append(line)
现在,您对该代码实际执行的操作是startswith
,不受任何长度参数的限制:
In [12]: line = '0123456789'
In [13]: line.startswith('0')
Out[13]: True
In [14]: line.startswith('0123')
Out[14]: True
In [15]: line.startswith('03')
Out[15]: False
所以你可以这样做来排除标题:
cleanLines = []
line = "sample input here"
headers = ["node", "path", "Path"]
if not any(line.startswith(header) for header in headers) : #skip standard headers
cleanLines.append(line)