Форум сайта python.su
Привет.
Есть два файла
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
Офлайн
Потому что csv.reader читает файл 1 раз и потом стоит в его конце.
Офлайн
doza_andИнтересная тонкость, спасибо. Как порекомендуете в моем случае обойти это? Читать файл2 заново на каждой итерации строки из файла1? Файл в это время может поменяться. Возможно, стоит создать некую статическую конструкцию из данных файлов и итерировать ее?
Потому что csv.reader читает файл 1 раз и потом стоит в его конце.
Отредактировано Yyy (Сен. 10, 2021 18:26:14)
Офлайн
Я бы порекомендовал прочитать второй файл занося элементы в словарь если их там нет.
Потом прочитать первый, беря элементы из словаря, если элемент там есть.
Отредактировано doza_and (Сен. 10, 2021 18:29:26)
Офлайн
Благодарю за помощь, так и сделаю.
Офлайн
YyyЧерез f1.seek(0) и f2.seek(0) в соответствующих местах.
Как порекомендуете в моем случае обойти это?
YyyДа, файлы лучше скопировать, перед тем как анализировать их. Для копирования сделай второй скрипт. И потом сделай третий скрипт, который запускает сначала скрипт копирования файлов, а потом скрипт анализа файлов.
Файл в это время может поменяться. Возможно, стоит создать некую статическую конструкцию из данных файлов и итерировать ее?
Отредактировано py.user.next (Сен. 11, 2021 05:48:59)
Офлайн
Yyy
Возможно, стоит создать некую статическую конструкцию из данных файлов и итерировать ее?
py.user.nextЭто зависит от постановки задачи. Если результат нужен именно на момент запуска файлов то простым копированием не обойтись. Второй файл может измениться за то время пока вы выполняете копирование первого. Возможны разные решения. Захват блокировки на оба файла. Циклические попытки копирования, до тех пор пока результат копирования не будет совпадать с исходными файлами (типа как делается с атомиками).
Да, файлы лучше скопировать, перед тем как анализировать их.
Офлайн
Все верно, я обошелся простыми локфайлами на время записи. Конститентность в порядке.
Офлайн
doza_andЯ имею в виду, что работа с CSV-файлами подразумевает, что они могут быть большими. Грузить их в память целиком может быть накладно (бывает, что это происходит в маленькой виртуальной машине, где оперативной памяти есть только немножко, потому что этих машин виртуальных сотня и все запущены в одно время, и так далее), а пока их читаешь в начале и середине, они уже могут поменяться в начале к тому времени. Поэтому нужно сделать снимок этих файлов и работать с ними в зафиксированном состоянии. А если этот файл весит гигабайт, например, то не нужно думать “а где бы взять гигабайт оперативки на словари/множества? а то вот мой скрипт без загрузки всего в память не работает”.py.user.nextЭто зависит от постановки задачи.
Да, файлы лучше скопировать, перед тем как анализировать их.
Офлайн