#python-3.x #path #discord.py #python-os
#python-3.x #путь #discord.py #python-os
Вопрос:
Я пытаюсь написать бота на python, который будет просто загружать массовые файлы в каталог на сервер. (В основном игровые клипы с несколькими скриншотами.) Проблема в том, что когда я динамически передаю путь к файлу, я получаю ошибку «файл не найден». При передаче его в жестком коде он работает нормально. Я распечатал и даже отправил в discord путь к файлу, и он правильный. Попробовал .strip() и .encode(‘unicode-escape’) и различные другие варианты, но не нашел ничего, что работает. Это меня немного озадачивает. Есть какие-нибудь идеи?
import os import discord import time from discord.ext import commands client = commands.Bot(command_prefix = '!!') #locations to upload locations = [ '/root/discord/', '/home/discord', ] #file types to not upload bad_files = [ 'viminfo', 'txt', 'sh', '', 'bat', ] #walk through directory and upload files async def dir_walk(ctx,p): for roots,dirs,files in os.walk(p): for i in dirs: for x in files: #check to see if file extension matches one listed to not upload. if x.split('.')[-1] in bad_files: pass else: try: #upload files file_path = os.path.join(roots,i,x) f = open(full_path,'rb') await ctx.send(i,file = discord.File(f,filename = x)) time.sleep(5) except: raise time.sleep(5) @client.command(pass_context=True, name="walk") async def list_dir(ctx): for x in locations: await dir_walk(ctx, x) client.run('')
Обратная связь-это :
Ignoring exception in command walk: Traceback (most recent call last): File "/usr/local/lib/python3.8/dist-packages/discord/ext/commands/core.py", li ne 85, in wrapped ret = await coro(*args, **kwargs) File "newwalk.py", line 50, in list_dir await dir_walk(ctx,x) File "newwalk.py", line 40, in dir_walk f = open(x,'rb') FileNotFoundError: [Errno 2] No such file or directory: 'ss dec_2019_1_20_0008.jpg' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/usr/local/lib/python3.8/dist-packages/discord/ext/commands/bot.py", lin e 939, in invoke await ctx.command.invoke(ctx) File "/usr/local/lib/python3.8/dist-packages/discord/ext/commands/core.py", li ne 863, in invoke await injected(*ctx.args, **ctx.kwargs) File "/usr/local/lib/python3.8/dist-packages/discord/ext/commands/core.py", li ne 94, in wrapped raise CommandInvokeError(exc) from exc discord.ext.commands.errors.CommandInvokeError: Command raised an exception: Fil eNotFoundError: [Errno 2] No such file or directory: 'ss dec_2019_1_20_0008.jpg'
Комментарии:
1. Если вы можете, также опубликуйте сообщение об ошибке/обратном отслеживании. Так же, как другой кодовый блок или ссылка на pastebin.
2. Абсолютно, я совершенно забыл об этом. Я добавил его сейчас.
3. Я немного изменил код, но это то же самое исключение, которое возникает, когда я использую то, что показано выше. разница только в том,что когда я скопировал исключение, я пытался os.chdir(os.path.join(корни,i)), а затем использовал f = open(x,’rb’), где, как и раньше, у меня был только полный путь к файлу full_path=os.path.join(корни, i, x) открыть(full_path,’rb’)
4. Хм, я рекомендую иметь
except FileNotFoundError:
блок и внутри него добавлять всеfull_path
, что не было найдено, в список. Затем распечатайте его и посмотрите, не случилось ли что-нибудь не так. Я также заметил, что воlocations
второй записи не заканчивается на а/
. Я сомневаюсь, что это вызывает ошибку, но, возможно, стоит проверить. Тем временем я собираюсь провести некоторое тестирование и попытаться помочь разобраться в этом5. Так что я смог заставить его работать над моим ботом с помощью странного исправления. Я не знаю, сработает ли это для вас, но, по сути, я разделился
full_path
и использовал только фактическое имя файла. Поэтому , сделавfull_path = os.path.join(roots,i,x)
это, попробуйтеfull_path = full_path.split("/")[-1]
. И затемf = open(full_path,'rb')
. Если это сбивает с толку, я могу опубликовать полный код, который у меня есть.
Ответ №1:
Мне удалось найти способ сделать это. Это займет еще немного времени, но я немного изменил код. Вот он.
import os import discord import time from discord.ext import commands client = commands.Bot(command_prefix = '!!') #locations to upload locations = [ '', ] #file types to not upload good_files = [ 'png', 'jpg', 'jpeg', 'mp4', 'mpg', 'mpeg', 'wav', 'flv', 'mov', 'gif', 'tif', 'bmp', ] #walk through directory and upload files async def dir_walk(ctx,p): for roots,dirs,files in os.walk(p): for i in dirs: os.chdir(os.path.join(roots,i)) for x in os.listdir('.'): if os.path.isfile(x): if x.split('.')[-1] in good_files: try: with open(x,'rb') as f: await ctx.send(i,file = discord.File(f,filename = x)) time.sleep(1) except: pass @client.command(pass_context=True, name="walk") async def list_dir(ctx): for x in locations: await dir_walk(ctx,x) client.run('')