2017-04-03 3 views
1

Ich habe eine Liste (oder ein Set oder Tupel, wenn ich wähle) von 56 verschiedenen Fischarten. Ich würde gerne durch eine CSV-Datei "scannen", um jedes Vorkommen einer der Fischarten zu erkennen.Python - erkenne einen Wert in einer Zeichenkette

Ich habe versucht:

with open(file_path) as f: 
    for line in f: 
     if (stocks in line): 
      fish, remainder = line.split('\t') 
      print("fish:", fish) 
      print("remainder:", remainder) 

aber das schlägt fehl, weil:

TypeError: 'in <string>' requires string as left operand, not tuple 

Also für diese für einen Weg zum Erfolg Ich bin auf der Suche.

Die Liste der möglichen Vorkommen:

stocks = (
     'GB COD EAST', 
     'GBE COD', 
     'GB COD WEST', 
     'GBW COD', 
     'GOM COD', 
     'GB HADDOCK EAST', 
     'GBE HADD', 
     'GB HADDOCK WEST', 
     'GBW HADD', 
     'GOM HADDOCK', 
     'GOM HADD', 
     'GOM HAD', 
     'GOM HADOCK', 
     'PLAICE', 
     'DABS', 
     'POLLOCK', 
     'POLL', 
     'REDFISH', 
     'REDS', 
     'RED', 
     'WHITE HAKE' , 
     'WHITEHAKE', 
     'WHAKE', 
     'WHAK', 
     'GB WINTER FLOUNDER', 
     'GB BB', 
     'GB WINTER', 
     'GB BLACK BACKS', 
     'GB BLACKBACKS', 
     'GOM WINTER FLOUNDER', 
     'GOM BLACKBACKS', 
     'GOM BB', 
     'GOM WINTER', 
     'SNE WINTER FLOUNDER', 
     'SNE WINTER', 
     'SNE/MA WINTER FLOUNDER', 
     'SNE BLACKBACK', 
     'SNE BLACKBACKS', 
     'SNE BB', 
     'WITCH FLOUNDER', 
     'WITCH', 
     'WHICH', 
     'WHITCH', 
     'GREYSOLE', 
     'GREY SOLE', 
     'CC/GOM YELLOWTAIL FLOUNDER', 
     'GOM YELLOWTAIL', 
     'GOM YELLOW TAIL', 
     'GOM YT', 
     'GB YELLOWTAIL FLOUNDER', 
     'GB YELLOWTAIL', 
     'GB YT', 
     'SNE/MA YELLOWTAIL FLOUNDER', 
     'SNE YT', 
     'SNE YELLOWTAIL', 
     'SNE YELLOW TAIL', 
     'SCALLOP IFQ' 
     ) 
+0

'stocks' ist ein Tupel. Sie suchen nach einem Tupel-Objekt in einer Zeichenfolge. Stattdessen benötigen Sie eine separate For-Schleife, um jede Zeichenfolge _inside_ des gesamten Tupels zu durchlaufen. – roganjosh

+0

Haben Sie überlegt, Bestände in eine Menge zu ändern - dh 'sstocks = set (stocks)' – user1245262

Antwort

1
with open(file_path) as f: 
    for line in f: 
     if any(stock.lower() in line.lower().strip() for stock in stocks): 
      fish, remainder = line.split('\t') 
      print("fish:", fish) 
      print("remainder:", remainder) 
+0

Also ich denke, es funktioniert, aber nur eine kurze Follow-up-Frage: es druckt nichts, ich denke, weil die 'Aktien' Tupel ist Gibt es in Großbuchstaben eine Möglichkeit, Groß-/Kleinschreibung zu ignorieren? Ich weiß, dass in RegEx existiert – theprowler

+1

Ja, Sie können die Bedingung aktualisieren: 'any (stock.lower() in line.lower(). Strip() für Lagerbestand)' – Elisha

+0

Es heißt: 'AttributError: 'Builtin_Funktion_oder_Methode' Objekt hat kein Attribut 'strip' bedeutet das 'strip()' funktioniert nicht mit der Datei? – theprowler

1

stocks ein Tupel ist, kann Sie nicht überprüfen, ob ein Tupel in einem String ist:

>>> ("a", "b") in "ab" 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'in <string>' requires string as left operand, not tuple 

Sie die built-in any() function verwenden stattdessen:

if any(stock in line for stock in stocks): 
0

In Python können Sie nur den Operator in mit einem rechten Operanden vom Typ string verwenden, wenn der linke Operand ebenfalls vom Typ string ist.

if (stocks in line):

Aktien ist ein Tupel und Linie ist String. Sie könnten die folgende Methode verwenden, vorausgesetzt, Sie alle Spiele wollen, einschließlich Duplikate:

with open(file_path) as f: for line in f: matches = [x for x in stocks if x in line] print(matches)

Verwandte Themen