2015-05-12 2 views
4

Я ищу вход для печати сообщения при создании каталогов. Im в смешанной среде os, но в моем случае с использованием Win 7, python 2.7, ArcGIS 10.2.Как отображать сообщения при создании каталогов?

Приведенный ниже код работает нормально, если функция существует, и если каталог существует, сообщение появляется на экране, однако я не могу получить сообщение, возвращенное на экран, когда os.makedirs фактически создает несуществующий каталог, а i хотел бы, чтобы код сделал это.

Я использовал Google и Stackoverflow и встретить много, много примеров, которые имеют дело с os.makdir, но не нашли, что решить мою проблему, которая похожа, но не такой же, как Check if Dir Exists

td = arcpy.env.workspace 

    dn1 = "Test" dirmk = td +sep+ dn1 

    try: 
     os.makedirs(dirmk) except OSError: 
     if os.path.exists(dirmk): 
      print '\n' + dn1 + " dir already exists so keep on hustlin" 
     else: 
      print '\n' + "Creating " + dn1 

ответ

6

Ваш else статья выглядит неуместной. В отправленном вами коде сообщение «Создать» было бы напечатано только тогда, когда произошло событие OSError И dirmk не существовало.

В этом фрагменте ниже, сообщение «Создано» будет напечатано, если при создании dirmk ошибок не было.

td = arcpy.env.workspace 

dn1 = "Test" 
dirmk = td + sep + dn1 

try: 
    os.makedirs(dirmk) 
except OSError: 
    if os.path.exists(dirmk): 
     print '\n' + dn1 + " dir already exists so keep on hustlin" 
else: 
    print '\n' + "Created " + dn1 

Это минимальное изменение в существующем коде, который удовлетворит ваш прецедент. Но вы можете сделать это более кратким и Pythonic, сделав что-то подобное предложению в другом ответе: https://stackoverflow.com/a/30180115/460282

+0

Отличное спасибо Jomel. это прекрасно работает. Я также ценю все комментарии и ответы ниже. Пальцы пересекли. Я могу успеть изучить все остальные варианты ниже на этой неделе. – user1995458

1

Перестановка код немного, так что он читает:

if not os.path.exists(dirmk): 
    print "Creating: {}".format(dirmk) 
    os.makedirs(dirmk) 
else: 
    print "{} already exists; skipping".format(dirmk) 

Вы уже пытаются использовать os.path.exists() так что используйте его в состоянии.

Если путь не существует; создать его и распечатать сообщение; в противном случае пропустить.

Альтернативой является использование try/except/else.

Update: Конечно, я могу понять, почему вы можете захотеть использовать try/except/else здесь, но ИХМО вы вызываете os.makedirs() независимо от того, существует ли путь или нет. Так что я хотел бы сделать это как улучшение, чтобы поймать и OSError (ы):

if not os.path.exists(dirmk): 
    print "Creating: {}".format(dirmk) 
    try: 
     os.makedirs(dirmk) 
    except: 
     print "Failed to create {}".format(dirmk) 
else: 
    print "{} already exists; skipping".format(dirmk) 

И если бы это было написано в качестве многоразовых функции вы могли бы короткое замыкание это просто:

def create_if_not_exists(dirmk): 
    if os.path.exists(dirmk): 
     print "{} already exists; skipping".format(dirmk) 
     return 

    print "Creating: {}".format(dirmk) 

    try: 
     os.makedirs(dirmk) 
    except: 
     print "Failed to create {}".format(dirmk) 
+0

Это зависит от того, что является более вероятным сценарием - это OP больше шансов найти, что каталог делает или не существует? –

+0

Хороший вопрос :) Но обычно это хорошо подходит для функций короткого замыкания, подобных этому, в любом случае для удобочитаемости (* если ничего больше *) :) –

+0

Это правда. Более распространенная идиома - это 'try/except/else'. –

3

Вы близки, но не совсем там. В вашем блоке try единственный раз, когда вы собираетесь попасть в except, есть OSError ... как файл уже существует. Поэтому вы никогда не увидите сообщение Creating....

Это должно работать лучше:

import os # In your original, you weren't importing this. 

td = arcpy.env.workspace 

dn1 = "Test" 
dirmk = td + sep + dn1 

try: 
    os.makedirs(dirmk) 

except OSError, e: 
    if e.errno == 17: # Error code for file exists 
     print '\n' + dn1 + " dir already exists so keep on hustlin" 
    else: 
     print "OSError %s" % e 

else: 
    print '\n' + "'" + dn1 + "' created!" 
+0

Вы можете получить errno с 'e.errno' –

+1

Сделано редактирование. Не могу поверить, что я совершил такую ​​новичковую ошибку. Спасибо, @PadraicCunningham! –

Смежные вопросы