Форум сайта python.su
Привет.
Соорудил класс 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, а вам? На самом деле, без разницы. Дописать ключ для записи и вё равно результат не тот, который ожидается. Как и в первом варианте, директории создаются, но файл нет. И по-прежнему возникает ошибка рекурсии.
Повторю вопрос: почему возникает ошибка рекурсии. Почему рекурсии так много, что она способна грохнуть сервер? Практически туда сюда бесконечность ;).
Офлайн
Рекурсия получается, потому что нефиг стандартные имена использовать, типа 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
Вообще класс сомнительный, ведь файлы потом вроде закрывать надо…
Офлайн
До сих пор непонятно зачем городить класс для такой пустяковой задачи, если достаточно функции:
<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>
Отредактировано (Янв. 22, 2007 07:53:40)
Офлайн
эээ? а как сделать код с подсветкой?
Офлайн
bialix: тут рядом тема “Подсветка синтаксиса ”.
Офлайн
Striver, bialix, вам обоим похеру чего писать, да? Самоцель - написать. Здорого, конечно, но читать нужно каждую строку, а не через одну.
За “#from re import split - nafig ne nado” и os.makedirs() спасибо, буду знать.
Я изучаю язык и мне хочется попробовать так и сяк, и мне хочется узнать почему не работает то или сё и по каким причинам. “Нехер” можете мамам своим оставить.
Вообщем, с одной стороны оно конечно спасибо, но с другой - идити-ка в пизду-ка.
Офлайн
lexa, поздравляю, ты стыл первым челом которого забанили на форуме.
Офлайн
bialix
<code:python> </code> в квадратный скобках
Офлайн