У меня есть скрипт на python, в котором я читаю CSV-файл, и по одному столбцу в CSV-файле, который я хочу найти и заменить из словаря.Мой код работает, если у меня есть 100% совпадающие поля как в CSV, так и в словаре.Моя проблема в том, что в словаре поле, содержащее совпадающую строку из csv, может быть внутри длинной строки, разделенной запятой, поэтому я хочу искать в строке словаря и при любом частичном совпадении я хочу заменить значение из словаря.Пример из кода под newdata выглядит следующим образом:
u'46764967051,46490797539,4639238933': u'google.com', u'46104376787335,46739600111': u'bt.se', u'46700961026,4638138399': u'lake.se'
И мое поле csv 2 - это то место, где у меня есть номер, с которым я хочу выполнить повторную подпункт.Допустим, у меня есть номер в этом поле csv: 4638138399 В этом случае я хочу searach для этого в словаре (newdata) и перейти к домену в этом примере "lake.se", как это число в последнем словаре (newdata).Итак, мой вопрос, что я могу изменить в строке
domain = re.sub(domain, lambda find_all: newdata.get(find_all.group(0), domain), domain)
Чтобы он выполнял поиск любого совпадения, а не только полного совпадения?
Мой код:
client = MongoClient('mongodb://ip-addr:27017/user')
db = client['user']
x = []
cur = db.user.find()
for i in cur:
x.append(i)
newdata = {}
for entry in x:
numbers = entry.pop('numbers')
numbers = numbers.replace("+","")
domain = entry.pop('domain')
newdata[numbers] = domain
def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
# csv.py doesn't do Unicode; encode temporarily as UTF-8:
csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
dialect=dialect, **kwargs)
for row in csv_reader:
# decode UTF-8 back to Unicode, cell by cell:
yield [unicode(cell, 'utf-8') for cell in row]
def utf_8_encoder(unicode_csv_data):
for line in unicode_csv_data:
yield line.encode('utf-8')
reader = unicode_csv_reader(codecs.open("201807_12_49333_N29069.csv",
encoding="iso-8859-1"))
for row in reader:
domain = row[2].encode('ascii')
domain = str(domain)
domain = re.sub(domain, lambda find_all: newdata.get(find_all.group(0), domain), domain)
row[2] = domain
print(row[2], row[3])