将.startswith()用于字符串中的特定位置的问题

时间:2017-07-11 10:40:14

标签: python data-science

我有一个文本文件,其中包含许多行数据。我需要检查此文本文件的每一行并相应地处理该行中包含的数据(即保存到单独的表格.txt进行分析)

文本文件采用以下格式:

  • 数字1或0(表示数据的相关性)
  • 每行的ID(指数据是什么)
  • 数据本身(包含在其余行中)

这就是两个示例行的样子:

1 ID:K-95 数据列表

0 ID:D-56 其他数据列表

这样第一行有ID K-95的相关数据,第二行有ID D-56的无关数据。

我想解析文本文件,并根据相关性(0或1)和数据ID对每行中包含的数据进行排序。即按相关性顺序保存每个具有相同ID的行(首先是所有行,然后是0,然后是0)。行可以具有相同的ID,但数据不同。线条也总是固定的长度。

要做到这一点,我想出了:

idtag = input('Enter ID:')

with open("example.txt", 'r') as f:                                                                                         
    for line in f.readlines():                                                                                              
        if line.startswith('1') and line.startswith(idtag, 5, 3):                                                                                            
            print line

但是遇到了麻烦。特别是在和运营商之后的第二个条件。我可以根据是否有0或1打印/选择行,没问题。但是,使用具有已定义位置的.startswith()方法似乎没有返回任何内容:没有错误,没有打印 - 它只是执行并且不返回任何内容。

有什么想法吗?也许是一种更好的方法来解析这些数据以达到我的目标?

2 个答案:

答案 0 :(得分:2)

对于str.startswithstartend被解释为绝对位置(具体来说:end不会相对于start进行解释):

  

str.startswith(prefix[, start[, end]])

     

如果字符串以前缀开头,则返回True,否则返回False前缀也可以是要查找的前缀元组。使用可选的 start ,从该位置开始测试字符串。 使用可选的结束,停止比较该位置的字符串。

所以而不是

line.startswith(idtag, 5, 3)

你需要使用

line.startswith(idtag, 5, 5+4)

这两个参数相当于切片符号:

line[5: 5+4].startswith(idtag)

例如:

>>> a = 'abcdefg'
>>> a.startswith('c', 2, 1)
False
>>> a[2:1]
''

>>> a.startswith('c', 2)
True
>>> a[2:]
'cdefg'

>>> a.startswith('c', 2, 3)
True
>>> a[2:3]
'c'

答案 1 :(得分:1)

我意识到已经有了答案,但作为替代方案,您还可以检查该行中是否存在idtag:

ls -l x* | awk '{print $9}' | xargs -n1 -P4 generateoutput.sh | tee -a output.csv