Возьмите 2 переменные из списка поиска в другом списке - PullRequest
0 голосов
/ 18 февраля 2020

Я работаю с файлом дампа GeoNames и хотел бы, чтобы скрипт работал. Он должен: 1) взять строку из первого текстового файла, например,

Джалал-Абад, AF

2) Взять "Jalalabad" как var1 и "AF" как var2 и использовать его при поиске в другом TXT-файл, в котором есть строка, например:

7053281 Джалалабад Джалал-Абад, Бихсуд, Джалал-Абад, Джалалабад, Бхсвд, Джалал-Абад, بهسود, جلال آباد 34.42189 70.463501 A-02/2018 АД201 / АСБ 2012 / АСБ 2018 / АСБ-02, Южная Африка, 18 апреля 2001 г., воеводство, воеводство, воеводство, воеводство, во вс.

Если он найден во втором списке, я хотел бы скопировать всю строку (пример выше) в третий файл, также в txt. Это мой сценарий:

myfile ='Geo.txt'
myfile2 = 'allADM.txt'

myfile3 = open('GeoSearch.txt','w',encoding="utf-8")

mylist = []
mylist2 = []


with open(myfile,'r',encoding='utf-8') as myfile:
    for row in myfile:
        row = row.split(", ")
        var1, var2 = row
        mylist.append(row)

with open(myfile2,'r',encoding='utf-8') as myfile2:
    for row in myfile2:
        row = row.strip()
        mylist2.append(row)

for i in mylist:
    if i[0] in mylist2.row and i[1] in mylist2.row:
            myfile3.write(f"{mylist2.row}\n")
    else:
        pass

Я получаю сообщение об ошибке: Traceback (последний вызов был последним): файл "C: / Users / xxx / Documents / python work / GeoNameSearch.py", строка 24, если i [0] в mylist2.row и i [1] в mylist2.row: AttributeError: у объекта 'list' нет атрибута 'row'

myfile = 'Geo.txt' - все вещи, которые я хочу запросить

myfile2 = 'allADM.txt' - массивный файл дампа, который я хочу найти в

myfile 3 = выходной файл

Любая помощь приветствуется!

EDIT1: изменена последняя часть:

for i in mylist2:
    if var1 in i and var2 in i:
            myfile3.write(f"{i}\n")
    else:
        pass

, в результате чего я получил последний результат из файла поиска (12,5 тыс. Строк). Кажется, переменные var1 и var2 продолжали сбрасываться, так что он искал его только один раз.

EDIT2, второй скрипт (предлагается ниже + настройки) также возвращает пустой список:

with open('Geo.txt', 'r', encoding='utf-8') as queries:
    search_data = set(queries.readlines())

with open('12.txt', 'r', encoding='utf-8') as dataset:
    data = dataset.readlines()

matching_lines = []

for params in search_data:
    param1, param2 = params.split(', ')

for line in data:
    if param1 in line and param2 in line:
        matching_lines.append(line)


with open('GeoSearch.txt', 'w', encoding='utf-8') as result:
    for res in matching_lines:
        result.write(f'{param1}|{param2}|{res}\n')

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Я бы использовал наборы, чтобы избежать повторения в вашем списке, также я считаю, что производительность не является проблемой, в противном случае вы можете открыть файл результатов и написать строку при каждом успешном совпадении.

with open('Geo.txt') as queries:
  search_data = set(line.strip() for line in queries.readlines())

with open('allADM.txt') as dataset:
  data = [line.strip() for line in dataset.readlines()]

matching_lines = []

for params in search_data:
  param1, param2 = params.split(',')

  for line in data:
    if param1 in line and param2 in line:
      matching_lines.append(line)

with open('GeoSearch.txt', 'w') as result:
  for res in matching_lines:
    result.write(f'{res}\n')
0 голосов
/ 18 февраля 2020

Вместо использования для l oop вы можете использовать readlines()

with open(myfile, 'r', encoding='utf-8') as myfile:
    mylist = myfile.readlines()

# Do same opration with the second one
with open(myfile2, 'r', encoding='utf-8') as myfile2:
    mylist2 = myfile2.readlines()

Теперь i содержит одну строку, так что вы можете легко сравнить две.

for i in mylist:
    if i in mylist2 and i in mylist2:
        myfile3.write(f"{i}\n")
    else:
        pass

Это значительно упростит вашу работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...