2017-07-11 56 views
1

我有一個文本文件,其中有許多行數據。我需要檢查該文本文件的每一行並處理相應行中所包含的數據(即保存到用於分析的單獨的,彙總的.txt)針對字符串中特定位置使用.startswith()的問題

該文本文件爲以下面的格式:

    (載於線的其餘部分)

因此,這是

  • 數1或0(表示數據的相關性)
  • 的每一行的ID(參照數據是什麼)
  • 數據本身哪兩個示例行可能看起來像:

    1 ID:K-95 數據的列表

    0 ID:d-56的其它數據

    ,使得第一線過相關的列表數據爲ID K-95,第二個數據與ID D-56無關。

    我想解析文本文件,並根據相關性(0或1)和數據ID對每行中包含的數據進行排序。即按照相關性順序保存每行具有相同ID的行(首先用1表示所有行,然後用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()方法與定義的位置一起使用似乎不會返回任何內容:無錯誤,無打印 - 它只是執行並不返回任何內容。

    任何想法?也許更好的解析這些數據來滿足我的目標?

  • +0

    是由分隔符分隔的數據列表,說逗號? –

    +0

    @SaikatKumarDey是的,它用以下格式的空格分隔:a:100F b:150A c:41S – tyrfingnir

    +0

    列表中項目的數量是否固定? –

    回答

    2

    startend被解釋爲絕對位置(具體:end不相對於start解釋),用於str.startswith

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

    返回True如果字符串與前綴開始,否則返回False前綴也可以是要查找的前綴元組。使用可選開始,測試字符串從該位置開始。 使用可選結束,停止在該位置比較字符串。

    所以不是

    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

    如果給出的示例ID具有代表性,您還需要增加結束參數(行[5:5 + 3]會給你「K-9」,這將不符合「K-95」)。 – kadnarim

    +0

    行,所以行3: '如果line.startswith('1')和line.startswith(idtag,5,3):' 是一個錯字,我應該把4放在因爲我認爲它有關到子串的長度,而不是相對位置。如果line.startswith('1')和line.startswith(idtag,5,5 + 4): 打印行' 此打印語句代碼塊不執行,行不返回 – tyrfingnir

    +0

    @tyrfingnir我做了一個稍微不同的方式測試它,它的工作原理:https://gist.github.com/MSeifert04/5c35af67aea9bd64df0bbe79d6104301 - 我不知道你輸入了什麼'idtag'和你的文件是怎麼樣的 - 所以也許只是沒有匹配? – MSeifert

    1

    我知道已經有一個答案,但作爲替代,你也可以只檢查是否存在IDTAG在線路:

    idtag = input('Enter ID:') 
    
    with open("example.txt", 'r') as f:                       
        for line in f.readlines():                        
         if line.startswith('1') and idtag in line:                        
          print line 
    
    相關問題