Программно создать каталог файлов с помощью Python? - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать серию папок и подпапок, используя python, но я просто не могу сделать это правильно.Я получаю сообщение об ошибке, когда папка папки, в которой я сейчас нахожусь, создается в этой же папкеЯ не могу понять, как объяснить это прямо.

import os, sys, errno

all_dirs = {
    'audio': ['Music', 'Audiobooks', 'Podcasts'],
    'documents': ['Forms', 'Bills', 'Legal', 'Financial'],
    'images': ['Photographs','Art', 'Friends', 'Family'],
    'literature': ['Novels', 'Poetry', 'Short Stories'],
    'software': ['Apps', 'Games'],
    'videos': ['TV Series', 'Movies', 'Documentaries']
}

def create_dirr(curr_dirr, dirs_to_create):
  if not os.path.exists(curr_dirr):
    try:
      os.makedirs(curr_dirr)
    except OSError as exc:  # Guard against race condition
      if exc.errno != errno.EEXIST:
        raise
  else:
    print 2, os.getcwd()
    for dirr in dirs_to_create:
      print 2.5, dirr, os.getcwd()
      os.path.join(os.getcwd(), curr_dirr)
      print 2.7, os.getcwd(), os.path.join(os.getcwd(), dirr)
      os.chdir(os.path.join(os.getcwd(), curr_dirr))
      # os.path.join(ff, dirr)
      print 2.8, os.getcwd()
      # os.makedirs(dirr)
      # os.chdir(os.path.join(os.getcwd(), curr_dirr))
      print 2.9, dirr, os.getcwd()
      vv = os.path.join(os.getcwd(), dirr)
      print 3, dirr, os.getcwd()
      print 4, os.path.exists(dirr)
      print 5, vv
      print 7, dirr, os.getcwd()
      print '------------------------------------'
      if not os.path.exists(vv):
        print "here"
        try:
          print 6, vv
          # os.makedirs(vv)
        except OSError as exc:  # Guard against race condition
          if exc.errno != errno.EEXIST:
            raise
for x in all_dirs:
  create_dirr(x, all_dirs[x])
  create_dirr(x, all_dirs[x])

Вот вывод и код ошибки:

2 /home/runner
2.5 Forms /home/runner
2.7 /home/runner /home/runner/Forms
2.8 /home/runner/documents
2.9 Forms /home/runner/documents
3 Forms /home/runner/documents
4 False
5 /home/runner/documents/Forms
7 Forms /home/runner/documents
------------------------------------
here
6 /home/runner/documents/Forms
2.5 Bills /home/runner/documents
2.7 /home/runner/documents /home/runner/documents/Bills
Traceback (most recent call last):
  File "python", line 130, in <module>
  File "python", line 104, in create_dirr
OSError: [Errno 2] No such file or directory: '/home/runner/documents/documents'

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Я понял это.

Сначала я создал переменную для os.getcwd() перед циклом.Затем я объединил его в os.path.join с curr_dirr и dirr.Я также удалил os.chdir().

Результат:

def create_dirr(curr_dirr, dirs_to_create):
  if not os.path.exists(curr_dirr):
    try:
      os.makedirs(curr_dirr)
    except OSError as exc:  # Guard against race condition
      if exc.errno != errno.EEXIST:
        raise
  else:
    print 2, os.getcwd()
    cd = os.getcwd()
    for dirr in dirs_to_create:
      print 2.5, dirr, os.getcwd(), os.path.join(cd, curr_dirr)
      print 2.7, os.path.join(cd, curr_dirr, dirr)
      print 2.8, cd
      print 3, dirr, cd
      print '------------------------------------'
      if not os.path.exists(os.path.join(cd, curr_dirr, dirr)):
        print "here"
        try:
          print 6, os.path.join(cd, curr_dirr, dirr)
          os.makedirs(os.path.join(cd, curr_dirr, dirr))
        except OSError as exc:  # Guard against race condition
          if exc.errno != errno.EEXIST:
            raise

Используя этот фрагмент для размещения структуры файла, я смог увидеть, как она работает.

for root, dirs, files in os.walk("."):
    path = root.split(os.sep)
    print((len(path) - 1) * '---', os.path.basename(root))
    for file in files:
        print(len(path) * '---', file)
0 голосов
/ 08 июня 2018

когда вы делаете os.chdir, вы еще не создали дочернюю папку.Легко исправить

до того, как сделать os.chdir сделать:

os.makedirs(os.path.join(os.getcwd(), curr_dirr), exist_ok=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...