Ответы пользователя по тегу Python
  • Как сделать Создание папок последоватлеьно os.makedirs?

    shabelski89
    @shabelski89
    engineer
    os.path
    import os
    
    
    def create_nested_folder(parent_folder: str, nested_folder: str):
    
        if not os.path.exists(parent_folder):
            path = os.path.join(parent_folder, nested_folder)
            os.makedirs(path)
            return True
        return False
    
    
    if __name__ == "__main__":
    
        folder = 'example'
        n_fodler = '2025'
    
        ret = create_nested_folder(folder, n_fodler)
        print(ret)
    Ответ написан
    Комментировать
  • Почему не правильно передается название файла?

    shabelski89
    @shabelski89
    engineer
    Вероятно нужно сделать url encode, попробуйте так
    import urllib.parse
    
    xml_event_data = """
                        <item EnabledEvent="False" UseDate="False" EveryYear="False" Imm="False" Above="False" FileName='run cmd /c del "{}"' MuteLev="50" DelPrev="True" DoNotRunIfStopped="False" bRepeat="True" nRepeatPer="5" DoNotMarkAsScheduled="False" nRepeat="2" RepeatLimit="True" TimeToStart="" Shuffle="False" PausePlaylist="False" UseWeeks="False" Enqueue="False" DelTaskAction="0" DelTaskUseDate="False" TaskName="{}" ClearMainPlaylist="False" UseDaysOfWeek="True" Hours="000000000000000000000000" Minutes="0" Seconds="0" TimeType="0" TaskNameAsTitle="False" IntTimeToStart="2147483647" ItemImageIndex="63" FontColor="-16777208" BackColor="-16777211" GroupName="" DTMFOn="False" DTMFString="" DTMFOnly="False" DTMFExitOn="False" DTMFExitString="" MaxTimeWaitOn="False" MaxTimeWaitSec="0" MaxTimeWaitAction="0" UseFillers="False" FillersSource="" FillersRecurse="True" FillerMaxAmount="120" Id="DKCODACFWSIKHULWXDUL" Days="1111111" Weeks="00000" Time="2018-02-17 00:00:00" DelTaskTime="2018-02-17 00:00:00" />
                        """.format(full_filename, task_name)
    
    xml_event_data = urllib.parse.quote_plus(xml_event_data)
    url_add = f"http://{ip_address}:9000/?pass={api_key}&action=schedule&type=add&event={xml_event_data}"
    Ответ написан
    2 комментария
  • Как считать файл и разбить текст на списки строк?

    shabelski89
    @shabelski89
    engineer
    def read_file(filename: str) -> str:
        with open(filename, 'r') as file:
            text = file.read()
        return text
    
    
    def count_articles(text: str, articles: str) -> int:
        text_as_list = text.lower().split()
        counter = 0
        for word in text_as_list:
            if word == articles.lower():
                counter += 1
        return counter
    
    
    if __name__ == "__main__":
        test_str = "Hello everyone, welcome to the party! I said hello to my friend  hello when I saw her in the park. Hello, how are you today? I hope everything is going well. She waved and said hello with a big smile on her face. After a warm hello, we started talking about our plans for the weekend."
        test_word = 'Hello'
        count = count_articles(test_str, test_word)
        print(f'Word "{test_word}" count = {count} !')
    Ответ написан
    Комментировать
  • Как в строке вывести соответствующее название атрибута в Python?

    shabelski89
    @shabelski89
    engineer
    Правильно было бы отделить друг от друга интерфейс взаимодействия с пользователем от калькулятора.

    import math
    
    
    class Distance:
        def __init__(self, lat, long):
            self._lat = math.radians(lat)
            self._long = math.radians(long)
    
        @property
        def lat(self):
            return self._lat
    
        @property
        def long(self):
            return self._long
    
        def __repr__(self):
            return f"latitude - {self._lat} longitude - {self._long}"
    
    
    class DistanceCalculator:
        K_CONST = 6371.01
    
        def calculate(self, point_a: Distance, point_b: Distance):
            return self.K_CONST * math.acos(
                math.sin(point_a.lat) * math.sin(point_b.lat) +
                math.cos(point_a.lat) * math.cos(point_b.lat) *
                math.cos(point_a.long - point_b.long)
            )
    
    
    class GUI:
        ACCEPTED_ACTIONS = {1: "Рассчёт дистанции", 2: "Выход"}
        ACCEPTED_ACTIONS_STR = "\n".join([f"{k}: {v}" for k, v in ACCEPTED_ACTIONS.items()])
    
        def main(self):
            while True:
                action = input(f'Выберите действие:\n{self.ACCEPTED_ACTIONS_STR}\n')
    
                try:
                    int_act = int(action)
                    if int_act not in self.ACCEPTED_ACTIONS:
                        raise ValueError('Недопустимый пункт меню')
    
                    if int_act == 1:
                        a = self.get_distance("A")
                        b = self.get_distance("B")
                        calc = DistanceCalculator()
                        distance = calc.calculate(a, b)
                        print(f'Distance between {a} and {b} is {distance}')
                    elif int_act == 2:
                        print('Выход')
                        break
    
                except (TypeError, ValueError) as E:
                    print(E)
    
        def get_distance(self, point: str):
            latitude = float(input(f'Enter the latitude point {point}: '))
            longitude = float(input(f'Enter the longitude point {point}: '))
            return Distance(latitude, longitude)
    
    
    if __name__ == "__main__":
        gui = GUI()
        gui.main()
    Ответ написан
    2 комментария
  • Как исправить ошибку open Dockerfile: no such file or directory?

    shabelski89
    @shabelski89
    engineer
    У вас тут куча ошибок:
    1) посмотрите терминал, где вы нагодитесь в данный момент запуская команду docker build , она запускается там где лежи Dockerfile
    2) файлы проекта - app.py и pyenv.cfg , и сам Dockerfile лежат почему внутри venv . Они должны быть сразу в PythonProject

    root@vs1:~/project/testproject# cat app.py
    
    def print_hi(name):
        print(f'Hi, {name}')  # Press Ctrl+F8 to toggle the breakpoint.
    
    
    if __name__ == '__main__':
        print_hi('PyCharm')

    root@vs1:~/project/testproject# cat Dockerfile
    FROM python:3.7
    
    WORKDIR /app
    
    COPY . .
    
    CMD ["python", "app.py"]


    667dad577a656337335174.png
    Ответ написан
    Комментировать
  • Как установить имя таблицы в виде даты sqlite3 Python?

    shabelski89
    @shabelski89
    engineer
    нужно прочитать про форматирование
    import datetime
    base_table_name = 'table_'
    base_table_name + datetime.datetime.now().strftime('%Y%m')
    'table_202406'
    Ответ написан
    5 комментариев
  • Как посчитать сумму одинаковых объектов в списке словарей?

    shabelski89
    @shabelski89
    engineer
    import json
    
    
    json_string = """[
                {
                    "uid_1c": "c1f5e839-0c1d-11ed-aa44-ac1f6bd30991",
                    "number": "1",
                    "amount": 19
                },
                {
                    "uid_1c": "c1f5e839-0c1d-11ed-aa44-ac1f6bd30991",
                    "number": "2",
                    "amount": 10
                },
                {
                    "uid_1c": "7421a94a-4327-11ed-aa45-ac1f6bd30990",
                    "number": "3",
                    "amount": 200
                }
    ]"""
    
    
    json_object = json.loads(json_string)
    
    # делаем базовый словарь на каждый уникальный uid
    base_dict_elem = {el.get('uid_1c'): {'uid_1c': el.get('uid_1c'), 'number': 0, 'amount': 0} for el in json_object}
    
    # итерируемся по списку словарей(json) для заполнения основного словаря
    for el in json_object:
        uid = el.get('uid_1c')
        amount = el.get('amount')
        base_dict_elem[uid]['amount'] += amount
    
    # формируем список словарей с уникальными uid и статистикой
    result = []
    counter = 1
    for k, v in base_dict_elem.items():
        v['number'] = counter
        result.append(v)
        counter += 1
    
    print(result)
    Ответ написан
    Комментировать
  • Коллеги, как разграничить тесты в pytest?

    shabelski89
    @shabelski89
    engineer
    Используйте маркеры, и при запуске указываете, какие тесты запускать.
    В офф доке наглядный пример
    Ответ написан
    Комментировать
  • Как вывести файл картинки(картинку) на экран из проводника компьютера?

    shabelski89
    @shabelski89
    engineer
    Вам нужен - Open File Dialog
    Вот тут пример для текстового файла, но раз вы знаете как уже отображать картинку, то проблем нет.
    Ответ написан
    Комментировать
  • Бесконечный цикл при некоторых условиях, почему?

    shabelski89
    @shabelski89
    engineer
    Вам нужно разобраться с базовыми операциями - % , // .
    from enum import Enum
    
    
    class Banknotes(Enum):
        ONE = 1
        TWO = 2
        FIVE = 5
        TEN = 10
        TWENTY = 20
        FIFTY = 50
        ONE_HUNDRED = 100
        TWO_HUNDRED = 200
        FIVE_HUNDRED = 500
        ONE_THOUSAND = 1000
    
    
    def get_min_count_banknotes(amount: int) -> dict:
        all_banknotes = {}
        for b in reversed(Banknotes):
            all_banknotes[b.name] = 0
            while amount // b.value > 0:
                all_banknotes[b.name] += 1
                amount -= b.value
    
        banknotes = {banknote: count for banknote, count in all_banknotes.items() if count != 0}
    
        return banknotes
    
    
    def get_total_count_banknotes(amount: int) -> int:
        ret = get_min_count_banknotes(amount)
        count = sum(ret.values())
        return count
    
    
    if __name__ == '__main__':
        # n = int(input('Введите сумму'))
        n = 1234
        b_notes = get_min_count_banknotes(n)
        for k, v in b_notes.items():
            print(f'Купюра - {k} , количество - {v}')
    
        cnt_b_notes = get_total_count_banknotes(n)
        print(f'Всего купюр - {cnt_b_notes}')
    
        # Купюра - ONE_THOUSAND, количество - 1
        # Купюра - TWO_HUNDRED, количество - 1
        # Купюра - TWENTY, количество - 1
        # Купюра - TEN, количество - 1
        # Купюра - TWO, количество - 2
        # Всего купюр - 6
    Ответ написан
    Комментировать
  • Почему не работает тг бот(Telebot, python)?

    shabelski89
    @shabelski89
    engineer
    кажется нужно заменить
    @bot.callback_query_handler(func=lambda callback: callback.data)

    на
    @bot.callback_query_handler(func=lambda callback: True)
    Ответ написан
  • Как нажать на кнопку с помощью selenium firefox в яндекс.переводчике?

    shabelski89
    @shabelski89
    engineer
    У них есть API за смешные 4$ - можно перевести 1млн символов (суммарно по запросам в месяце).
    Ответ написан
    Комментировать
  • Как работает @property.getter?

    shabelski89
    @shabelski89
    engineer
    Так делать нельзя, но можно переопределять значение атрибута и в зависимости от его типа вернуть с постобработкой для указанного типа.
    class TestClass:
        def __init__(self, number: (int, str)):
            self._number = number
    
        @property
        def number(self):
            if isinstance(self._number, int):
                return self.__int_number()
            elif isinstance(self._number, str):
                return self.__str_number()
            else:
                return self._number
    
        @number.setter
        def number(self, value):
            self._number = value
    
        def __int_number(self):
            return self._number * 100
    
        def __str_number(self):
            return f'Hello world - {self._number}'
    
    
    value_int = 150
    testInstance = TestClass(value_int)
    print(testInstance.number)
    
    value_str = '0MG'
    testInstance.number = value_str
    print(testInstance.number)
    
    value_another_type = ['one', 'two']
    testInstance.number = value_another_type
    print(testInstance.number)
    Ответ написан
    Комментировать
  • Python Replace ломает файл. Почему?

    shabelski89
    @shabelski89
    engineer
    так как никакого трейс лога нет, то я бы предложил чуть быстрее выходить из with open.

    delta2_days = 1  # delta2.days
    DELTA_DAYS = 14
    FILE = r'C:\\m\\notice.ini'
    REPLACE_ONE = '2-0\n'
    REPLACE_TWO = '2-1\n'
    
    def read_file(filename: str):
        with open(filename, 'r') as f:
            return f.read()
    
    
    def write_file(filename: str, data):
        with open(filename, 'w') as f:
            f.write(data)
    
    
    print(f'Дата {"меньше" if delta2_days <= DELTA_DAYS else "больше "} 14 дней')
    # app_log.info(f'Дата {"больше" if some > DELTA_DAYS else "меньше"} 14 дней')
    old_data = read_file(FILE)
    new_data = old_data.replace(REPLACE_ONE, REPLACE_TWO) if delta2_days <= DELTA_DAYS else old_data.replace(REPLACE_TWO, REPLACE_ONE)
    write_file(FILE, new_data)
    Ответ написан
    Комментировать
  • Как исправить ошибку «TypeError: bytes or str expected, not class int»?

    shabelski89
    @shabelski89
    engineer
    Вы уверены что нужно делать так ?
    client.start('79829815504')

    а не просто
    client.start()

    ?
    Ответ написан
  • Как исправить ошибку?

    shabelski89
    @shabelski89
    engineer
    Написано же - у объекта Button нет в конструкторе style .
    Ответ написан
    Комментировать
  • Как передать tsv файл в аргумент функции pytest?

    shabelski89
    @shabelski89
    engineer
    Не понятно что внутри файла с регепсом и зачем он в файле, но вот вам пример как передавать файлы из папки аргументом. Каждый файл .tsv пройдёт отдельным тестом, то есть сколько файлов столько выполнен тест.
    import os
    import re
    import pytest
    
    
    def get_tsc_files(filepath: str):
        return [
            open(os.path.join(filepath, file)).read().strip('\n')
            for file in os.listdir(filepath)
            if os.path.isfile(os.path.join(filepath, file) and file.endswith('.tsv'))
        ]
    
    def get_regex_emails():
        return re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')
    
    
    path = 'C:\Работа'
    @pytest.mark.parametrize('regex, checked_file', [(get_regex_emails(), file) for file in get_tsc_files(path)])
    def test_match(regex, checked_file):
        assert bool(re.search(regex, checked_file)) is True
    Ответ написан
    Комментировать
  • Почему возникают проблемы при использовании docx2pdf на python?

    shabelski89
    @shabelski89
    engineer
    convert это функция, в принципе можно взять готовый консольный вариант у меня в гитхабе
    Usage python docx_to_pdf.py -i file1.docx file2.docx
    Ответ написан
    Комментировать