2017-07-11 2 views
1

Ich habe eine Textdatei, die viele Zeilen von Daten enthält. Ich brauche jede Zeile dieser Textdatei zu überprüfen und zu verarbeiten, um die in der Zeile entsprechend enthaltenen Daten (dh speichern zu einem separaten, tabellarisch .txt für die Analyse)Probleme mit. Startswith() für eine bestimmte Stelle in einer Zeichenfolge

Die Textdatei in folgendem Format ist:

  • Nummer 1 oder 0 (bezeichnet Relevanz der Daten)
  • Eine ID für jede Zeile (in Bezug auf das, was die Daten)
  • die Daten selbst (in Rest der Zeile enthalten)

das ist also welche zwei Beispielzeilen aussehen kann:

1 ID: K-95 Liste der Daten

0 ID: D-56 Liste anderer Daten

Derart, dass die erste Zeile relevant hatte Daten zu ID K-95 und die zweite hatten irrelevante Daten zu ID D-56.

Ich möchte die Textdatei analysieren und die Daten in jeder Zeile basierend auf der Relevanz (0 oder 1) und der Daten-ID sortieren. I.e. Speichere jede Zeile mit der gleichen ID in der Reihenfolge der Relevanz (zuerst alle Zeilen mit 1 und dann mit 0). Zeilen können die gleiche ID, aber unterschiedliche Daten haben. Linien haben auch immer eine feste Länge.

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 

Nachdem jedoch mit diesem Problem:

diese kam ich mit zu tun. Speziell um die zweite Bedingung nach dem Operator und. Ich kann Zeilen drucken/auswählen, je nachdem, ob es eine 0 oder 1 gibt, kein Problem. Die Methode .startswith() mit einer definierten Position scheint jedoch nichts zurückzugeben: kein Fehler, kein Drucken - es wird einfach ausgeführt und gibt nichts zurück.

Irgendwelche Ideen? Vielleicht eine bessere Möglichkeit, diese Daten zu analysieren, um mein Ziel zu erreichen?

+0

die Liste der Daten durch ein Trennzeichen getrennt ist, sagt Komma? –

+0

@SaikatKumarDey Ja, es wird durch Leerzeichen im folgenden Format getrennt: a: 100F b: 150A c: 41S – tyrfingnir

+0

Ist die Anzahl der Elemente in der Liste festgelegt? –

Antwort

2

Die start und end werden als absolute Positionen interpretiert (genauer gesagt: end nicht relativ zu interpretieren start) für str.startswith:

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

Return True wenn Zeichenfolge beginnt mit dem Präfix, sonst zurückgeben False. Präfix kann auch ein Tupel von Präfixen sein, nach denen gesucht werden soll. Mit optional Start, Testzeichenfolge an dieser Position beginnen. Mit optional Ende aufhören, String an dieser Position zu vergleichen.

Also statt

line.startswith(idtag, 5, 3) 

Sie benötigen

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

Die beiden Parameter äquivalent zu schneiden Notation verwenden:

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

Zum Beispiel:

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

Wenn die angegebenen Beispiel-IDs repräsentativ sind, müssen Sie auch den End-Parameter erhöhen (Zeile [5: 5 + 3] würde Ihnen "K-9" geben, was nicht "K-95" entspricht). – kadnarim

+0

OK, also die 3 in der Zeile: 'wenn line.startswith ('1') und line.startswith (idtag, 5, 3): ' war ein Tippfehler, ich sollte 4 setzen, weil ich dachte, es gehöre auf die Länge der Teilzeichenfolge anstatt auf die relative Position. Allerdings habe ich immer noch das gleiche Problem ... 'wenn line.startswith ('1') und line.startswith (idtag, 5, 5 + 4): Druck line' Die print-Anweisung in diesem Codeblock wird nicht ausgeführt, die Zeile wird nicht zurückgegeben – tyrfingnir

+0

@Tyrfennir Ich habe es auf eine etwas andere Art und Weise getestet und es funktionierte: https://gist.github.com/MSeifert04/5c35af67aea9bd64df0bbe79d6104301 - Ich weiß nicht, was Sie eingegeben haben 'idtag' und wie deine Datei aussieht - also gibt es vielleicht keine Übereinstimmung? – MSeifert

1

Ich weiß, es ist schon eine Antwort, aber als Alternative können Sie auch nur überprüfen, ob idtag in der Zeile vorhanden ist:

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 
Verwandte Themen