Найти - Пользователи
Полная версия: Рекурсивное создание директорий
Начало » Python для экспертов » Рекурсивное создание директорий
1
lexa
Привет.

Соорудил класс open для замены стандартного, главная штука в том, чтобы директории создавались, а не только файл.

Проверяю:
open('d:/dir/subdir/and/more/and/few/file.txt').write('content')
File “<pyshell#138>”, line 10, in write
return open(self.mkdir(self.file), self.k).write(content)
Потом идёт тоже самое и много-много раз, очень много. То есть действительно очень много.

А потом:

File “<pyshell#138>”, line 15, in mkdir
a = split('/', file)
File “C:\Python25\lib\re.py”, line 157, in split
return _compile(pattern, 0).split(string, maxsplit)
File “C:\Python25\lib\re.py”, line 222, in _compile
p = _cache.get(cachekey)
RuntimeError: maximum recursion depth exceeded in cmp
И я как бы понимаю в чём ошибка: рекурсии много, и сервер вот-вот отдал бы концы. Но не понимаю с чего её много так?

Вот класс:

class open:
def __init__(self, file, k = 'r'):
self.k = k
self.file = file

def read(self):
return open(self.file, self.k).read()

def write(self, content):
return open(self.mkdir(self.file), self.k).write(content)

def mkdir(self, file):
from re import split
from os import mkdir, path
a = split('/', file)
f = a.pop()
c = []
for i in a:
c.append(i)
p = '/'.join(c)
if not path.exists(p):
mkdir(p)
return p + '/' + f
bialix
а вам не кажется, что в файл открытый для чтения писать нельзя?
lexa
bialix, а вам? На самом деле, без разницы. Дописать ключ для записи и вё равно результат не тот, который ожидается. Как и в первом варианте, директории создаются, но файл нет. И по-прежнему возникает ошибка рекурсии.

Повторю вопрос: почему возникает ошибка рекурсии. Почему рекурсии так много, что она способна грохнуть сервер? Практически туда сюда бесконечность ;).
Striver
Рекурсия получается, потому что нефиг стандартные имена использовать, типа open и file. Начал создавать класс open - забудь про такую встроенную функцию (а она и в read и в write используется). А файл не создётся - bialix сказал уже - у функции open флаг должен быть ‘w’
У меня так получилось:

#from re import split - nafig ne nado
from os import mkdir, path

class open1:
def __init__(self, fil, k = ‘r’):
self.k = k
self.fil = fil

def read(self):
fil=open(self.fil, self.k)
return fil.read()

def write(self, content):
fil=open(self.mkdir(self.fil), self.k)
return fil.write(content)

def mkdir(self, fil):
a = fil.split('/')
f = a.pop()
a+='/'
c =
for i in a:
c.append(i)
p = ‘/’.join©
if not path.exists(p):
mkdir(p)
return p + ‘/’ + f

Вообще класс сомнительный, ведь файлы потом вроде закрывать надо…
bialix
До сих пор непонятно зачем городить класс для такой пустяковой задачи, если достаточно функции:

<pre>
import os

def myopen(path, mode='r'):
dir = os.path.dirname(path)
if not os.path.isdir(dir) and mode == ‘w’:
os.makedirs(dir)
return file(path, mode)
</pre>
bialix
эээ? а как сделать код с подсветкой?
Striver
bialix: тут рядом тема “Подсветка синтаксиса ”.
lexa
Striver, bialix, вам обоим похеру чего писать, да? Самоцель - написать. Здорого, конечно, но читать нужно каждую строку, а не через одну.

За “#from re import split - nafig ne nado” и os.makedirs() спасибо, буду знать.

Я изучаю язык и мне хочется попробовать так и сяк, и мне хочется узнать почему не работает то или сё и по каким причинам. “Нехер” можете мамам своим оставить.

Вообщем, с одной стороны оно конечно спасибо, но с другой - идити-ка в пизду-ка.
alafin
lexa, поздравляю, ты стыл первым челом которого забанили на форуме.
slav0nic
bialix
<code:python> </code> в квадратный скобках
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB