Да. Используйте os.path.splitext
(см. документация Python 2. X или документация Python 3. X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
В отличие от большинства ручных разделяющих строку попыток, os.path.splitext
будет правильно рассматривать /a/b.c/d
как имеющий расширение вместо того, чтобы иметь расширение .c/d
, и оно будет рассматривать .bashrc
как имеющий расширение вместо того, чтобы иметь расширение .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
Нет, StringBuilder
- это полностью управляемый ресурс. Вам просто нужно избавиться от всех ссылок на него. Обо всем остальном позаботится сборщик мусора:
StringBuilder sb = ...;
// ... do work
sb = null; // or simply let it go out of scope.
В .NET нет детерминированного удаления
(например, C ++, где вы освобождаете память, выделенную для одного объекта). Только сборщик мусора может освободить память. Отказавшись от всех ссылок на объект, вы позволите GC освободить объект, если он захочет. Вы можете принудительно выполнить сборку мусора, вызвав метод System.GC.Collect
. Однако не рекомендуется манипулировать с помощью GC, если вы действительно не знаете, что делаете. GC умный. Принуждение к нему редко бывает полезным.
Unless the 'excessive memory usage' is a problem, I would leave it as it is and not worry about it.
.NET is in most cases smart enough to avoid doing a garbage collection if you have enough memory available.
If you are generating many reports, you could consider re-using a single StringBuilder instead of allocating a new one for each report.