2017-04-03 40 views
1

我有一个56种不同鱼种的列表(或者如果我选择,可以是集合或元组)。我想通过CSV文件“扫描”来识别任何鱼类的发生。Python - 识别字符串中的值

我想:

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) 

但失败的原因为:

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

所以我要寻找这个办法成功。

可能出现的列表:

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'是一个元组。您正在查找字符串中的元组对象。相反,你需要一个单独的'for'循环遍历整个元组中的每个字符串。 – roganjosh

+0

你是否考虑过把股票变成一套 - 也就是'sstocks = set(股票)' – user1245262

回答

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

所以我认为它有效,但只是一个快速跟进问题:它不打印任何东西,我认为是因为'股票'元组是总之,有没有办法忽略大/小写?我知道存在RegEx – theprowler

+1

是的,你可以更新条件:'stock(stock.lower()in line.lower()。strip()for stock in stocks)' – Elisha

+0

它说:'AttributeError:'builtin_function_or_method'对象没有属性'strip''这是否意味着'strip()'不能在文件上工作? – theprowler

1

stocks是一个元组,你不能检查,如果一个元组是一个字符串

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

您可以使用built-in any() function相反:

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

如果左操作数也是字符串类型,则Python只允许您使用带有右操作数类型字符串的in运算符。

if (stocks in line):

股是一个数组和线串。你可以用下面的方法,假设你希望所有的比赛,包括重复:

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