Ответы пользователя по тегу Python
  • Как изменить определённый элемент списка в цикле for?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну и для коллекции самый кондовый способ
    Надо, всё-таки, перед тем как использовать всякие enumerate, сначала понять как вообще работают циклы.
    i=0
    length = len(votes)
    while i < length:
        votes[i] = votes[i].replace(',', '')
        i += 1
    Ответ написан
    1 комментарий
  • Выходит ошибка с файлами что делать?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Указать правильный путь к файлу
    Ответ написан
    Комментировать
  • Как писать в csv в определенную колонку, а строки со второй?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не нужно искать решение специфической задачи "как писать в колонку".
    Это всё равно что отдельно искать в гугле ответы на вопросы "как есть борщ", "как есть солянку", "как есть щи".
    Надо освоить несколько базовых понятий, и уже применять их для решения неограниченного круга задач.
    В данном случае надо просто подумать - что такое файл, что такое csv файл, как можно организовать работу с несколькими колонками. А главное - понять, что файл всегда перезаписывается ЦЕЛИКОМ. То есть каждый скрипт должен писать все колонки, а не только свои.
    И всё получится сделать, самыми простыми средствами.

    Если оставить в стороне эпическую кривизну исходной задачи "несколько скриптов пишут в один файл", которая в итоге приведёт к полному удалению информации из файла, то по сути задача сводится к работе со списками.
    Прочитал из файла список списков, заменил или добавил нужные значения, записал в файл. Не бином ньютона.
    Ответ написан
  • TypeError: can only concatenate list (not "str") to list?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Скажите, что, по вашему, означают вот эти скобочки - [ и ]? Они здесь просто для красоты?
    Ответ написан
  • Насколько допустимо с точки зрения стилистики вызывать Exception в конструкции if/else?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос не очень понятен, особенно в части "обрабатывать" можно как через try/catch".

    Если я правильно понял, то задача - выбросить кастомное исключение, и выбор между проверкой через if и поимкой встроенного TypeError с последующим перевыбросом исключения со своим текстом ошибки.

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

    Я бы только инвертировал условие, чтобы во-первых, сделать логику более стройной (проверили - вывалились), а во-вторых, чтобы избавиться от else и убрать лишний отступ.
    if not (isinstance(data_set, list) or isinstance(data_set, tuple)): 
        raise TypeError('argument must be list or tuple')
    return sum(data_set) / len(data_set)


    Но в целом я бы использовал другой подход.
    Если мы хотим свой собственный текст ошибки, то это явно намекает на валидацию данных с последующим информированием пользователя об ошибке.
    А чтобы сделать валидацию, исключения не нужны. Мы просто проверяем полученные данные и выдаём ошибку.

    То есть в реальном коде я бы убрал проверку из функции вообще, а проверял данные при их получении (и выводил ошибку).
    А на случай, если вдруг функция всё равно будет вызвана с неверным типом аргумента, есть системное исключение, 'type' object is not iterable
    Ответ написан
    Комментировать
  • Как подсчитать количество элементов в списке с помощью nunique()?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    подсчитать количество элементов в списке без len, и вывести через print уведомление.

    Этот вопрос звучит настолько по-дурацки, что его вполне можно понять буквально
    count = 0
    for tmp in friends:
        count += 1
    Ответ написан
    Комментировать
  • Почему не работает код?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что результат замены надо записывать. replace() только возвращает результат, а не изменяет исходную строку.
    В целом алгоритм конечно кривой. Чтобы заменить буквы на цифры, не нужно перебирать строку по одной букве. А если уж и делать перебором, как у вас, то тогда собирать новую строку из х.
    Но по уму надо просто сделать в цикле замену по словарю

    Если уж соревноваться в решениях, хотя автор вроде бы не просил, то беглое гугление даёт
    number.translate(''.maketrans("ABCDEFGHIJKLMNOPQRSTUVWXYZ","22233344455566677778889999"))
    Ответ написан
    Комментировать
  • Как быстро найти совпадение в базах?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    либо цикл for в котором перебираются название баз данных и идет поиска по таблице
    либо навести один раз порядок в этом бардаке
    например, если это multi-tenant приложение, то запрашивать не только логин и пароль, но и приложение, например в виде субдомена.
    при текущей структуре ничто не мешает появлению одного и того же пользователя в разных базах
    Ответ написан
  • Как отсортировать кортеж по заданному интервалу времени?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Разумеется, все фильтры и сортировки должны быть только в SQL запросе.
    Чтобы "из сторонней бд" "вытягивались" сразу только нужные данные, уже отсортированные в нужном порядке
    Ответ написан
  • Почему else — invalid syntax?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну неужели самому не видно что предыдущая строчка без отступа?
    Ответ написан
    1 комментарий
  • Создать таблицу базы данных postgresql из json файла?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я бы исходный джейсон развернул в словарь, где ключом является id
    И дальше шёл просто по этому словарю, добавляя записи в БД. Проверяя, есть ли уже парент.
    если нет - то создавать по цепочке, пока не появится
    Ответ написан
    Комментировать
  • Как сделать повторный запуск программы через input, ответом "да или нет"?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Фарш невозможно провернуть назад.
    Блок else вызывается ПОСЛЕ того, как блок while ЗАКОНЧИЛ работу.

    В данном случае, если хотим вернуться, то очевидно что всю логику надо писать внутрь while, а else тут просто не нужен. А всю начинку оттуда добавить в ветку, где чел угадал номер.
    Ответ написан
  • Why does Not all parameters were used in the SQL statement error apear?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    "I am try" звучит примерно как "я попытайся".

    По поводу ошибки. Самое важное, чему должен научиться каждый нуб в питоне (а точнее - в программировании в целом) - это такое понятие, как отладка.
    В которой нет ничего сложного. Это всего лишь означает посмотреть глазками на результат своих действий.

    В том, чтобы наугад писать какие-то слова от балды, нет ничего зазорного - мы все так делаем. Примерно как с английским - да какая разница, try или trying? Но в отличие от английского, языки программирования позволяют нам проверить, соответствует ли результат ожидаемому.
    И в данном случае сообщение об ошибке нам даже подсказывает, куда смотреть: ему явно не нравится значение, которое мы добавляем в БД. И дальше надо сделать две простые вещи:
    Первое - спросить себя, сколько значений мы хотим добавить в БД?
    И второе - распечатать переменную, которая содержит эти самые значения. Сделать такую банальность, как print(val). И сравнить реальность с ожиданиями.
    А дальше совсем просто - полюбовавшись на дело рук своих, начинаем смотреть: каких-таких функций мы навызывали, что у нас получился такой результат. И избавиться от ненужной.

    Но это всё мелочь и ерунда по сравнению с важнейшим понятием отладки, с которым мы познакомились сегодня. Поэтому повторим:
    • внимательно прочитать сообщение об ошибке и подумать - что оно означает.
    • вывести все промежуточные результаты нашей программы, чтобы понять - в каком месте всё пошло не так
    Ответ написан
    2 комментария
  • Как правильно отформатировать query string внутри json?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это какой-то кошмар.
    Никогда нельзя ковыряться руками в специализированных форматах.
    А надо использовать только предназначенные для этого инструменты. Тем более что это не так сложно.
    В данном случае надо
    • аккуратно распаковать json
    • вытащить из него и аккуратно распаковать query string
    • поменять значение на нужное
    • аккуратно запаковать query string
    • аккуратно запаковать json
    • и никаких f-strings!
    from urllib import parse
    import json
    
    text =  '{"req":[{"index":"prod","param":"q=%s&hits=4&filters=live%3A1"}]}'
    arr = json.loads(text)
    qs = parse.parse_qs(arr['req'][0]['param'])
    qs['q'] = model
    arr['req'][0]['param'] = parse.urlencode(qs,doseq=True)
    text = json.dumps(arr)

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

    spoiler
    Такое ощущение, что Питон - это новый пэхапе. 10 лет назад на пыхе точно также колупали чем попало, лишь бы заработало здесь и сейчас. И теперь тоже самое в питоне начинается
    Ответ написан
    5 комментариев
  • Как обновить данные в mysql?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Кто ж вас учил так с БД работать?
    Во-первых, данные всегда должны всегда передаваться в запрос отдельно.
    Во-вторых, код соединения совсем непонятный.
    Если используется mysql.connector, то надо как-то так
    import mysql.connector
    conn = mysql.connector.connect(host='127.0.0.1', database='test', user='user', password='')
    cursor = conn.cursor()
    sql = "UPDATE `user` SET `participate`=%s WHERE `id` = %s"
    cursor.execute(sql, [number, id])
    conn.commit()
    Ответ написан
    5 комментариев
  • Ошибка IntegrityError: UNIQUE constraint failed?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ахаха, я наконец увидел. Я уже отвечал на этот вопрос.
    Причём, судя по всему, тому же самому клиенту.

    Ну что ж за мания такая, писать имена полей в одинарных кавычках? Откуда эта глупость?
    Если это тот же самый клиент, то почему такая необучаемость? Если другой, то это значит какой-то очередной сетевой гуру так вещает? И где можно припасть к источнику его мудрости?
    Ответ написан
    1 комментарий
  • Почему моя программа не работает так, как надо?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Иногда я смотрю на qna и удивляюсь. На букву о.
    Казалось бы, задачка примитивная, для первого класса, ошибки очевидные.
    Сейчас автору всё объяснят.
    Но тут собирается консилиум лучших умов, и начинается. "Дело тёмное, ничего непонятно...", "открывай файл на чтение", "файл надо переименовать".

    Судя по всему, задача действительно очень сложная, так что одними наводками не получится, надо привести полное решение

    filename = input('Введите имя файла: ')
    file1 = open(f'D:\\Txtfiles\\{filename}')
    contents = file1.read()
    print(contents)
    file2 = open(r'images\3.txt', 'w')
    n = 0
    file1.seek(0)
    for line in file1:
        n += 1
        file2.write(str(n) + ')' + line)
    file1.close()
    file2.close()

    можно так, а можно как Алан Габизов предложил, через splitlines
    Ответ написан
    4 комментария
  • Как удалить строки в CSV?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    создаём пустой временный файл
    читаем большой csv файл построчно:
        проверяем нужное условие: 
            если оно выполняется, то пишем строку в новый файл
    закрываем временный файл
    переименовываем временный файл в исходный
    Ответ написан
    8 комментариев
  • Чем ошибки отличаться от исключений?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Насколько я понимаю, ошибками в питоне считаются фатальные ошибки, исключениями - все остальные.
    Плюс исключения можно бросать самому.
    Ответ написан
  • Как отсортировать CSV файл по дате?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если без изысков
    with open(filename) as file:
        csv = file.read().splitlines()
    sorted(csv)
    for line in csv:
        item = line.split(',')
        if  line[0] > '2010-06-08' 
            print(line)
    Ответ написан
    Комментировать