Все вышеизложенное работает ужасно с большими партиями или небольшим объемом памяти. Пришлось написать свой собственный, который будет конвейер (нигде не заметил накопления элемента):
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())
Я вижу два ответа с хорошими качествами, каждого с маленьким дефектом, таким образом, я дам свое взятие на нем:
Попытка 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.
Я лично рекомендовал бы использовать 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()
.
Проверьте os.makedirs
: (Это удостоверяется, что полный путь существует.)
Для обработки факта каталог мог бы существовать, поймать OSError
. (Если exist_ok
False
(значение по умолчанию), OSError
повышен, если целевой каталог уже существует.)
import os
try:
os.makedirs('./path/to/somewhere')
except OSError:
pass
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
Теперь, как я говорю, это не является действительно надежным, потому что у нас есть возможность отказа создать каталог и другой процесс, создающий его в течение того периода.
Попробуйте os.path.exists
функция
if not os.path.exists(dir):
os.mkdir(dir)