Абсолютный путь работает при жестком коде, но не при хранении в переменной в python

#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('')