Найти - Пользователи
Полная версия: Вложенная итерация
Начало » Python для новичков » Вложенная итерация
1
Yyy
Привет.

Есть два файла
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 не итерируются и не выводятся, когда совпадения есть?
doza_and
Потому что csv.reader читает файл 1 раз и потом стоит в его конце.
Yyy
doza_and
Потому что csv.reader читает файл 1 раз и потом стоит в его конце.
Интересная тонкость, спасибо. Как порекомендуете в моем случае обойти это? Читать файл2 заново на каждой итерации строки из файла1? Файл в это время может поменяться. Возможно, стоит создать некую статическую конструкцию из данных файлов и итерировать ее?
doza_and
Я бы порекомендовал прочитать второй файл занося элементы в словарь если их там нет.
Потом прочитать первый, беря элементы из словаря, если элемент там есть.

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

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

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

Я считаю что если у вас файлы асинхронно дописываются, то скорее всего у вас фатальные проблемы в архитектуре системы.
Yyy
Все верно, я обошелся простыми локфайлами на время записи. Конститентность в порядке.
py.user.next
doza_and
py.user.next
Да, файлы лучше скопировать, перед тем как анализировать их.
Это зависит от постановки задачи.
Я имею в виду, что работа с CSV-файлами подразумевает, что они могут быть большими. Грузить их в память целиком может быть накладно (бывает, что это происходит в маленькой виртуальной машине, где оперативной памяти есть только немножко, потому что этих машин виртуальных сотня и все запущены в одно время, и так далее), а пока их читаешь в начале и середине, они уже могут поменяться в начале к тому времени. Поэтому нужно сделать снимок этих файлов и работать с ними в зафиксированном состоянии. А если этот файл весит гигабайт, например, то не нужно думать “а где бы взять гигабайт оперативки на словари/множества? а то вот мой скрипт без загрузки всего в память не работает”.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB