@JyriG

Почему csv writer не записывает все итерации, хотя должен?

Перепишу вопрос, так как попробовал другие решения, которые не помогли задаче + по просьбе участников этого прекрасного портала.

Итак, пишу код по обновлению данных товаров в Jupyter notebook, на питоне.
Проблема вот в чем. Этот код:
c = open("c_pr.csv",'w',encoding='utf-8')
csv_writer = csv.writer(c)
csv_writer.writerow(["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35"])

with open("c_variable.csv",encoding="utf8") as f1, open("c_variation.csv",encoding="utf8") as f2:
    rd1, rd2 = csv.reader(f1),list(csv.reader(f2))
    for row1 in rd1:
        for row2 in rd2:
            if(str(row1[2]) == str(row2[4])):
                row1[29]+="," + str(row2[29])
                row1[20]+="," + str(row2[20])
                csv_line = [row2[1],row2[2],row2[3],row2[4],row2[5],row2[6],row2[7],row2[8],row2[9],row2[10],row2[11],row2[12],row2[13],row2[14],row2[15],row2[16],row2[17],row2[18],row2[19],row2[20],row2[21],row2[22],row2[23],row2[24],row2[25],row2[26],row2[27],row2[28],row2[29],row2[30],row2[31],row2[32],row2[33],row2[34],row2[35]]
                csv_writer.writerow(csv_line)
        csv_line = [row1[1],row1[2],row1[3],row1[4],row1[5],row1[6],row1[7],row1[8],row1[9],row1[10],row1[11],row1[12],row1[13],row1[14],row1[15],row1[16],row1[17],row1[18],row1[19],row1[20],row1[21],row1[22],row1[23],row1[24],row1[25],row1[26],row1[27],row1[28],row1[29],row1[30],row1[31],row1[32],row1[33],row1[34],row1[35]]
        csv_writer.writerow(csv_line)
        
print(row1[2]) # Выводит YYCHI


Берет файл с данными товаров типа variable и файл с данными товаров типа variation (потом они станут товарами в интернет-магазине), и добавляет атрибуты с variation к товарам variable, если их артикулы (SKU) совпадают.

В файле c_variable.csv - 2568 строк, в последней строке товар с артикулом YYCHI.
в файле c_variation.csv - 6144 строк, в последней строке товар с артикулом YYCHI/RED.

В новом файле c_pr.csv должно быть 8712 (=6144+2568) строк. Последняя строка - YYCHI. Предпоследняя - YYCHI/RED. Забегая вперед, он правильно и записывает, если дождаться выполнения скрипта и запустить опять. Но это не выход, скрипт будет поставлен в вечный цикл в продакшене.

Если я нажму традицонно на ""Restart Kernel and Run all" или запускаю файл.py через консоль в происходит что-то странное... В файле c_pr.csv 8695 строк, последние строки не YYCHI, а товар на 17. месте с конца. Команда print все ещё выводит артикул YYCHI. Что не так? Почему он не может правильно записать YYCHI и последние строки с конца, которые тоже не записаны? Он ведь по идее должен пройтись по всем строкам?

* Формат строк ничем не отличается друг от друга, это уже проверил
* time.sleep не помогает
* Try: Except: тоже не помогает.

Парюсь над вопросом третий день. Есть идеи, как исправить?
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Почему csv iterator не записывает все, хотя должен?

Нет, не должен. Итератор не должен ничего записывать, он интератор. Итератор итерирует. Всё.

Вот вы пришли с вопросом, но по какой-то причине не включили в него самое важное, то по чему можно определить причину такого повеения вашей программы.

Во-первых, вы не привели примера данных. Если что-то идёт не так, как ожидается, ВСЕГДА нужно приводить два набора данных: тот, который работает как ожидается и тот, который как ожидается не работает. При этом не обязательно приводить полные наборы данных, ведь их может оказаться очень много. Всегда нужно стараться упростить непонятную ситуацию максимально, и в какой-то момен она станет понятной. Ну, то есть, возможных причин проблемы в рассмотрении станет достаточно мало, чтобы понять какая из них действительна.
В данном случае нужно было убирать из CSV всё лишнее до тех пор, пока проблема сохраняется. Если убирать уже нечего, то останутся только проблемные записи и, возможно, посмотрев на них, вы сразу всё поймёте. Или поймёт тот, к кому вы пришли с вопросом.

query = """variables_loaded[variables_iterator]['0']""" ##, так далее

Во-вторых, у вас какой-то совершенно невалидный SQL-запрос. Он бессмысленный и неправильный. Вот это буквально текст, который запросом не является. Он даже не меняется от итерации к итерации, понимаете? Нам тут не ясно что вы имели в виду под "так далее", нам тут не ясно понимаете вы что такое SQL и что вот та строка им не является.

При всех ваших ошибках в постановке вопроса нам тут уже не ясно, может быть у вас вообще нет работающего кода, который что-то записывет из CSV в БД, а то, что вы думаете он, якобы, запсывает, уже и так есть в БД, а вы просто этого не понимаете! Ну как не понимаете, что проблема может быть в SQL-запросе, поэтому его не приводите, как не понимаете, что проблема может быть в индексах и структуре БД, поэтому не приводите её структуры, как не понимаете, что проблема может быть в данных (они могут повторяься в разных строках CSV), а вы и не приводите все данные, и не говорите, что убедились, что они не повторяются!

execute_query(connection, query)

В-третьих, вы оставляете за скобками код выполнения SQL-запроса. Мы не знаем что это за код, может быть там вы тупо try-except'ом задавили все возможные ошибки и сами, фактически, отказались от того, чтобы БД вам объяснила в чем проблема. Может быть это вообе пустая функция внутри, или она неправильно обернута каким-нибудь декоратором, который ей не дает работать, а вы просто видите в БД одни и те же данные, и думаете. что они каждый раз туда заливаются вновь вот этим неработающим вообще кодом.

Как нам судить обо всём этом букете гипотетических пробелм, если вы старательно все улики замели под ковер? Для чего вы это сделали?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы