Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 10, 2021 17:01:45

Yyy
Зарегистрирован: 2021-09-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Вложенная итерация

Привет.

Есть два файла

cat /tmp/1.csv 
1;2
2;3
3;56
4;8
5;9

cat /tmp/2.csv
1;1
1;2
1;3
1;4
1;5
1;6
1;7
1;8
2;9
2;10
2;11
3;12
3;13
3;14
4;15
4;16
5;17

Я пытаюсь для каждого первого элемента первого файла вывести совпадающий первый элемент второго файла.
 #!/usr/bin/env python3
import csv
file1 = '/tmp/1.csv'
file2 = '/tmp/2.csv'
with open(file1) as f1, open(file2) as f2:
    r1 = csv.reader(f1, delimiter=';')
    r2 = csv.reader(f2, delimiter=';')
    for i in r1:
        i0 = i[0]
        for n in r2:
            n0 = n[0]
            if i0 == n0:
                print(i0, n0)
В итоге получаю:
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1

Никак не соображу, почему все останавливается на первом элементе первого файла? Почему 2-5 не итерируются и не выводятся, когда совпадения есть?

Офлайн

#2 Сен. 10, 2021 18:23:24

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

Вложенная итерация

Потому что csv.reader читает файл 1 раз и потом стоит в его конце.



Офлайн

#3 Сен. 10, 2021 18:24:48

Yyy
Зарегистрирован: 2021-09-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Вложенная итерация

doza_and
Потому что csv.reader читает файл 1 раз и потом стоит в его конце.
Интересная тонкость, спасибо. Как порекомендуете в моем случае обойти это? Читать файл2 заново на каждой итерации строки из файла1? Файл в это время может поменяться. Возможно, стоит создать некую статическую конструкцию из данных файлов и итерировать ее?

Отредактировано Yyy (Сен. 10, 2021 18:26:14)

Офлайн

#4 Сен. 10, 2021 18:28:55

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

Вложенная итерация

Я бы порекомендовал прочитать второй файл занося элементы в словарь если их там нет.
Потом прочитать первый, беря элементы из словаря, если элемент там есть.



Отредактировано doza_and (Сен. 10, 2021 18:29:26)

Офлайн

#5 Сен. 10, 2021 18:35:25

Yyy
Зарегистрирован: 2021-09-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Вложенная итерация

Благодарю за помощь, так и сделаю.

Офлайн

#6 Сен. 11, 2021 05:47:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9878
Репутация: +  853  -
Профиль   Отправить e-mail  

Вложенная итерация

Yyy
Как порекомендуете в моем случае обойти это?
Через f1.seek(0) и f2.seek(0) в соответствующих местах.

Yyy
Файл в это время может поменяться. Возможно, стоит создать некую статическую конструкцию из данных файлов и итерировать ее?
Да, файлы лучше скопировать, перед тем как анализировать их. Для копирования сделай второй скрипт. И потом сделай третий скрипт, который запускает сначала скрипт копирования файлов, а потом скрипт анализа файлов.



Отредактировано py.user.next (Сен. 11, 2021 05:48:59)

Офлайн

#7 Сен. 11, 2021 14:07:04

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

Вложенная итерация

Yyy
Возможно, стоит создать некую статическую конструкцию из данных файлов и итерировать ее?
py.user.next
Да, файлы лучше скопировать, перед тем как анализировать их.
Это зависит от постановки задачи. Если результат нужен именно на момент запуска файлов то простым копированием не обойтись. Второй файл может измениться за то время пока вы выполняете копирование первого. Возможны разные решения. Захват блокировки на оба файла. Циклические попытки копирования, до тех пор пока результат копирования не будет совпадать с исходными файлами (типа как делается с атомиками).

Если допустима рассинхронизация первого и второго файла по времени то все равно остается проблема неконсистентности формата файла если он на ходу дописывается.

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



Офлайн

#8 Сен. 12, 2021 01:28:09

Yyy
Зарегистрирован: 2021-09-10
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Вложенная итерация

Все верно, я обошелся простыми локфайлами на время записи. Конститентность в порядке.

Офлайн

#9 Сен. 12, 2021 07:05:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9878
Репутация: +  853  -
Профиль   Отправить e-mail  

Вложенная итерация

doza_and
py.user.next
Да, файлы лучше скопировать, перед тем как анализировать их.
Это зависит от постановки задачи.
Я имею в виду, что работа с CSV-файлами подразумевает, что они могут быть большими. Грузить их в память целиком может быть накладно (бывает, что это происходит в маленькой виртуальной машине, где оперативной памяти есть только немножко, потому что этих машин виртуальных сотня и все запущены в одно время, и так далее), а пока их читаешь в начале и середине, они уже могут поменяться в начале к тому времени. Поэтому нужно сделать снимок этих файлов и работать с ними в зафиксированном состоянии. А если этот файл весит гигабайт, например, то не нужно думать “а где бы взять гигабайт оперативки на словари/множества? а то вот мой скрипт без загрузки всего в память не работает”.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version