Как я могу поставить '..' в пути, которые мы указали в параметре os.listdir? - PullRequest
0 голосов
/ 16 апреля 2020

Я использую функцию os.listdir, чтобы (как вы можете себе представить) вывести список папок и файлов, которые у меня есть в папке. Как сказано в документации, «в нее не входят специальные записи». и '..', даже если они присутствуют в каталоге. ".

У меня проблема с этим, потому что мой код предназначен для публикации на GitHub, и я не хочу, чтобы все видели весь мой путь и кроме того, поскольку у них нет одинакового пути, код для них не работает.

Так что мне интересно, как обойти это.

Спасибо!

PS: моя папка выглядит так: папка . Код python находится в папке py, а папки и файлы, к которым я хочу получить доступ, находятся в папке Dico.

Ответы [ 4 ]

0 голосов
/ 16 апреля 2020

Я предполагаю, что ваша файловая структура выглядит следующим образом.

folder---
    py---
  dico---

И я также предполагаю, что вы пробовали os.listdir("../dico") и получили ошибку, похожую на эту FileNotFoundError: [Errno 2] No such file or directory:

Но позвольте мне заверить вас, что код верен. Причина ошибки может быть следующей.
Если вы запускаете код из IDE, проверьте путь терминала.
Это будет /yoursystempath/folder/, а не /yoursystempath/folder/py. это распространенная ошибка, так как большинство IDE запускает интерпретатор python на уровне папки проекта. не на уровне сценария.

лучший способ справиться с путями в python - создать переменную rootdir в одном из файлов сценария в папке py и импортировать ее, где требуется.

from os import listdir, path
# this return the abspath to the current folder irrespective of where interpreter starts
curdir = path.abspath(path.join(path.abspath(__file__), path.pardir))
# this will return the rootdir path assuming its one level up.
#in your case it will return abs path for folder
rootdir = path.abspath(path.join(curdir, path.pardir))

#now use rootdir to reference any file in your file structure
#to get to dico use the following
dicoPath = path.abspath(path.join(rootdir,"dico"))
#now use listdir with varible dicoPath
listdir(dicoPath)

Теперь, если вы хотите использовать переменную rootdir в другом скрипте в папке py, используйте следующее.

from yourFileWhichHasTherootdir import rootdir
0 голосов
/ 16 апреля 2020

Вы неправильно поняли документацию. В документации говорится, что специальные записи '.' и '..' не будут отображаться в выводе из os.listdir.

В документации не говорится, что происходит что-то особенное или необычное если аргумент до os.listdir включает ... Вам не нужно использовать абсолютные пути или другие обходные пути. Если вы хотите получить список содержимого каталога с именем Dico рядом с рабочим каталогом, вы можете просто использовать

os.listdir('../Dico')
0 голосов
/ 16 апреля 2020

Вы можете создать путь относительно модуля:

import os

path = os.path.join(os.path.split(__file__)[0], '..', 'Dico')
os.listdir(path)

Если вы готовите пакет, для Python 3.7+ вы также можете использовать importlib.resources :

import importlib

importlib.resources.contents('package.Dico')
0 голосов
/ 16 апреля 2020

Если вы находитесь в папке py и хотите перечислить файлы внутри Dico, которая находится рядом с py, используйте следующее:

os.listdir('../Dico')
...