Вот один из способов сделать это, используя наборы. Если ни одна строка не соответствует параметрам поля, то для его индекса возвращается -1, аналогично str.find()
.
#!/usr/bin/env python
accnums = set(['account number', 'account #', 'account num', 'accnum'])
firstnames = set(['first name', 'firstname', '1stname'])
def find_fields(seq):
accnum, firstname = (-1, -1)
for i, field in enumerate(seq):
field = field.lower()
if field in accnums:
accnum = i
elif field in firstnames:
firstname = i
return accnum, firstname
testdata = [
['account number', 'first name'],
['account #', 'First Name'],
['ACCOUNT NUMBER', 'FIRST NAME'],
['accnum', '1stname'],
['country', 'lastname', 'account num', 'account type', 'firstname'],
['accnum', '1stname', 'account #'],
['albatross', 'first name'],
['Account Number', 'duck'],
]
for data in testdata:
print data, find_fields(data)
выход
['account number', 'first name'] (0, 1)
['account #', 'First Name'] (0, 1)
['ACCOUNT NUMBER', 'FIRST NAME'] (0, 1)
['accnum', '1stname'] (0, 1)
['country', 'lastname', 'account num', 'account type', 'firstname'] (2, 4)
['accnum', '1stname', 'account #'] (2, 1)
['albatross', 'first name'] (-1, 1)
['Account Number', 'duck'] (0, -1)
Обратите внимание, что, если он находит несколько соответствующих записей для поля возвращает индекс соответствия поля последний. Таким образом, для ['accnum', '1stname', 'account #']
он возвращает 2 как индекс для номера номера счета.
Вы можете развернуть блок if: ... elif:
в find_fields()
, чтобы обрабатывать больше полей с различными именами, но если у вас много таких полей, тогда было бы лучше изменить логику так, чтобы она работала со списком множеств, а не с индивидуальные наборы.
Переполненный мешок напоминает мне xmas :) – mhawke
Не могли бы вы подробнее рассказать о своей проблеме? возможно, ожидаемый результат может помочь! – Kasramvd
Имеет ли каждый файл CSV имена полей в первой строке файла? –