Пишу бота на аиограм. Не создается папка через модуль os и exceptions?

Привет. Суть вопроса следующая, пытаюсь писать ботов на aiogram , суть моего вопроса такова --

на сервере будет специальная директория для хранения данных пользователей, пользователь, например, жмет команду /start и берется его уникальный айди и передается в функцию для проверки директории на наличие такой папки, если возвращается True значит есть такая папка и идем дальше, а если возвращается False - такой папки нет и функция создаст директорию. Но у меня так не получается. Показываю код.

my_path = r'C:\\Users\\User\\Desktop\\python\\my_first_project\\Documents\\'

@dp.message_handler(Text(equals=["Регистрация"]))
async def registration_step(message: Message):
user_ids = message.chat.id
reply_id = await add_id_to_db(user_ids)

if reply_id:
await message.answer("Двигаемся вперед...")
else:
await message.answer("Мы не нашли вас в базе")

reply_id1 = await create_personal_folder(user_ids)
if reply_id1 == "Двигаемся дальше":
await message.answer("Двигаемся вперед...") #означает папка создана
else:
await message.answer("Вы давно уже зарегистрированы")

async def add_id_to_db(users1_id): #функция добавляет айди юзера в базу данных
os.chdir(root_path)
async with aiosqlite.connect('id.db') as db:
await db.executescript("""
CREATE TABLE IF NOT EXISTS id_list(
id INTEGER
);
CREATE TABLE IF NOT EXISTS tmp_id(
tmp_id INTEGER
);
""")
await db.execute("INSERT INTO id_list(id) VALUES(?)", [users1_id])
await db.executescript(""" INSERT INTO tmp_id SELECT DISTINCT id FROM id_list;
DELETE FROM id_list;
INSERT INTO id_list SELECT * FROM tmp_id;
DELETE FROM tmp_id;
""")
await db.commit()
return True

async def create_personal_folder(id_data): #Фукнция принимает айди юзера, проверяет есть ли такая папка, а если ее нету - создает ее, и тут функция постоянно шлет false "Вы давно были зарегистрированы" хотя в пути my_path она даже не создается

os.chdir(my_path)
check_dir = os.listdir()
for items in check_dir:
if items != str(id_data):
os.mkdir(f'{my_path}{str(id_data)}')
return "Двигаемся дальше"
else:
return "Вы давно были зарегистрированы"
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Некрасивое и неправильное использование методово os.

Если делаете путь с флагом r - можно не экранировать бекслеши. И трейлинг слеш не нужен, так что
my_path = r'C:\Users\User\Desktop\python\my_first_project\Documents'


os.chdir(my_path) - не нужен

В таком коде:
check_dir = os.listdir()
for items in check_dir:
if items != str(id_data):

папка будет создаваться всегда (если она не стоит в самом верху). Плюс, такое использование в принципе может привести к проблемам, если существует файл с одноименным названием. Лучше всего будет использовать встроенный метод os.path.isdir(path), который проверяет, является ли переданный в него путь папкой (не файлом).

Есть os.mkdir(), а есть os.makedirs(), может тоже в будущем поможет. Мы будем брать os.mkdir().

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

folder_path = os.path.join(my_path, id_data)

Если все это соединить, в конце получим нормально работающий красивый код:
my_path = r'C:\Users\User\Desktop\python\my_first_project\Documents'

async def create_personal_folder(id_data): 
    folder_path = os.path.join(my_path, str(id_data))
    if os.path.isdir(path):
        return 'Вы давно были зарегистрированы'
    else:
        os.mkdir(folder_path)
        return 'Двигаемся дальше'


В следующий раз оборачивайте код в специальный тег, никому не интересно читать невалидный файл.
Небольшой читшит: https://pythonworld.ru/moduli/modul-os-path.html
И не нужно писать ответ как тот, который вы написали. Это поле для ответа, никто не заходит в вопрос, если видно, что на него уже дали ответ, а на деле оказывается это вы просто пометку оставили. Редактируйте вопрос, либо пишите в комментарий к вопросу, если есть детали
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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