Как я могу безопасно создать вложенный каталог?

Все вышеизложенное работает ужасно с большими партиями или небольшим объемом памяти. Пришлось написать свой собственный, который будет конвейер (нигде не заметил накопления элемента):

public static class BatchLinq {
    public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int size) {
        if (size <= 0)
            throw new ArgumentOutOfRangeException("size", "Must be greater than zero.");

        using (IEnumerator<T> enumerator = source.GetEnumerator())
            while (enumerator.MoveNext())
                yield return TakeIEnumerator(enumerator, size);
    }

    private static IEnumerable<T> TakeIEnumerator<T>(IEnumerator<T> source, int size) {
        int i = 0;
        do
            yield return source.Current;
        while (++i < size && source.MoveNext());
    }
}

Изменить: Известная проблема с этим подходом заключается в том, что каждая партия должна быть перечислина и перечислина полностью, прежде чем перейти к следующей партии. Например, это не работает:

//Select first item of every 100 items
Batch(list, 100).Select(b => b.First())
3729
задан Georgy 16 May 2019 в 08:51
поделиться

5 ответов

Я вижу два ответа с хорошими качествами, каждого с маленьким дефектом, таким образом, я дам свое взятие на нем:

Попытка os.path.exists , и рассматривают os.makedirs для создания.

import os
if not os.path.exists(directory):
    os.makedirs(directory)

, Как отмечено в комментариях и в другом месте, существует состояние состязания – если каталог будет создан между os.path.exists и os.makedirs, то вызовы, эти os.makedirs перестанут работать с OSError. К сожалению, ловля слоя OSError и продолжение не является надежной, поскольку это проигнорирует отказ создать каталог из-за других факторов, таких как недостаточные полномочия, полный диск, и т.д.

, Одна опция состояла бы в том, чтобы захватить OSError и исследовать встроенный код ошибки (см. , там межплатформенный способ получить информацию от Python’s OSError):

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

, С другой стороны, могла быть секунда os.path.exists, но предположить, что другой создал каталог после первой проверки, затем удалил ее перед второй – нас можно было все еще дурачить.

В зависимости от приложения, опасность параллельных операций может быть более или менее, чем опасность, созданная другими факторами, такими как полномочия файла. Разработчик должен был бы знать больше о конкретном разработанном приложении и его ожидаемая среда прежде, чем выбрать реализацию.

современные версии Python улучшают этот код вполне немного, обоих путем представления FileExistsError (в 3,3 +)...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... и путем разрешения аргумент ключевого слова [1 114] названный exist_ok (в 3,2 +).

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.
4581
ответ дан Adam Smith 16 May 2019 в 08:51
поделиться

Я лично рекомендовал бы использовать os.path.isdir() для тестирования вместо os.path.exists().

>>> os.path.exists('/tmp/dirname')
True
>>> os.path.exists('/tmp/dirname/filename.etc')
True
>>> os.path.isdir('/tmp/dirname/filename.etc')
False
>>> os.path.isdir('/tmp/fakedirname')
False

, Если Вы имеете:

>>> dir = raw_input(":: ")

И глупый ввод данных пользователем:

:: /tmp/dirname/filename.etc

... Вы собираетесь закончить с каталогом, названным filename.etc при передаче того аргумента os.makedirs(), если Вы тестируете с os.path.exists().

98
ответ дан Peter Mortensen 16 May 2019 в 08:51
поделиться

Проверьте os.makedirs : (Это удостоверяется, что полный путь существует.)
Для обработки факта каталог мог бы существовать, поймать OSError. (Если exist_ok False (значение по умолчанию), OSError повышен, если целевой каталог уже существует.)

import os
try:
    os.makedirs('./path/to/somewhere')
except OSError:
    pass
73
ответ дан Georgy 16 May 2019 в 08:51
поделиться
  • 1
    К вашему сведению: Это происходит не только с кнопками, но и с TextViews, которые имеют background набор. Я использовал focusable="false" для обхождения его. – Joshua Pinter 13 October 2013 в 22:25

Я подавил следующее. Это не является полностью надежным все же.

import os

dirname = 'create/me'

try:
    os.makedirs(dirname)
except OSError:
    if os.path.exists(dirname):
        # We are nearly safe
        pass
    else:
        # There was an error on creation, so make sure we know about it
        raise

Теперь, как я говорю, это не является действительно надежным, потому что у нас есть возможность отказа создать каталог и другой процесс, создающий его в течение того периода.

30
ответ дан Peter Mortensen 16 May 2019 в 08:51
поделиться
  • 1
    кажется странным, необходимо установить это в обоих XML и код, но это решение работало на меня. Хорошая Работа! – Hector 13 September 2013 в 08:13

Попробуйте os.path.exists функция

if not os.path.exists(dir):
    os.mkdir(dir)
33
ответ дан jesterjunk 16 May 2019 в 08:51
поделиться
  • 1
    Спасибо, это должно быть отмечено как ответ! Решенный моя проблема. – Luke Vo 14 August 2013 в 08:35
Другие вопросы по тегам:

Похожие вопросы: