Уведомления

Группа в Telegram: @pythonsu

#1 Июль 20, 2015 17:14:36

iskrama
Зарегистрирован: 2015-07-20
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск соответствий в двух файлах и запись в третий

Здравствуйте. Помогите решить задачку.
Есть два больших файла (больше гига). В них располагаются строки с 11 столбцами. данные в ячейках могут меняться. т.е. в первой строке и втором столбце значение имеет 10 символов, а во второй строке и втором столбце только 5.
Необходимо взять значение из второго(и/или третьего) столбца и найти совпадение во втором файле. В положительном случае записать всю строку из первого и найденные строки из второго в третий файл.
набросал небольшой скрипт для поиска, а вот вычленить отдельные элементы не могу.
Что добавить/исправить?

search_num = ‘123’
with open('thirdfile', ‘a’) as result:
for files in ('D:\python\first.txt', ‘D:\python\second.txt’):
with open(files) as source:
for line in source:
if search_num in line:
result.write(line)

Заранее благодарен.

Офлайн

#2 Июль 21, 2015 00:27:46

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Поиск соответствий в двух файлах и запись в третий

iskrama
Что добавить/исправить?
Код, мать его, в теги.



Офлайн

#3 Июль 21, 2015 08:09:35

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Поиск соответствий в двух файлах и запись в третий

iskrama
Есть два больших файла (больше гига).
Под большими обычно понимают файлы которые не лезут в оперативную память. Для больших файлов используют СУБД там есть алгоритмы для работы с последовательностями которые не лезут в память.
То что вы описываете это основная операция СУБД. Называется join. Обычно эту задачу решают импортом в базу данных и применением одной команды. Тем более что потом можно будет еще что-то сделать.

iskrama
Необходимо взять значение из второго(и/или третьего) столбца и найти совпадение во втором файле.
Ваш код делает не то что вы описали словами. Так что надо?

iskrama
а вот вычленить отдельные элементы не могу.
Вычленяют обычно применяя
"a b c".split()[2]

Если все это надо сделать один раз в жизни то можно решить так: Пройти по меньшему файлу и накопить словарь
{"содержимое колонки 2 со строки 5":[[200,500],[800,900]],"содержимое колонки 3 со строки 6":[[250,550],[850,950]]...}
Ключик тут - то что вы будете искать в другом файле, значение - координаты начала и конца строки в файле поскольку уникальность ключей не оговорена это список. см seek, tell у файла.
Далее идете последовательно по второму файлу и что-то делаете. Что я не понял:
iskrama
и найти совпадение во втором файле
Это строка полностью должна совпасть или поле? или любое поле? В общем если тест можно будет оформить операцией in со словарем то все нормально.
Эти строки второго файла можете сразу писать в третий. А координаты строк первого добавляете в новый список. Этот список сортируете по возрастанию координаты строки. И операциями seek,read извлекаете строки. Если список не отсортировать то вас замучают операции seek и вы будете долго ждать результата (если конечно что-то найдется).

Операция lines обычно работает медленно. Если сможете организуйте блочное чтение файла.

Ну вот, это если по простому, а по сложному берете sqlite и пишете одну строчку после ознакомления с мануалом.






Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version