Index: Doc/library/tempfile.rst =================================================================== --- Doc/library/tempfile.rst (revision 62573) +++ Doc/library/tempfile.rst (working copy) @@ -136,6 +136,15 @@ .. versionadded:: 2.3 +.. function:: mkstempf([suffix=''[, prefix='tmp'[, dir=None[, text=False]]]]) + + As :func:`mkstemp except a file object opened with mode "w+" or "w+b" + (depending on the value of *text*) is returned instead of a + file descriptor. + + .. versionadded:: 2.6 + + .. function:: mkdtemp([suffix=''[, prefix='tmp'[, dir=None]]]) Creates a temporary directory in the most secure manner possible. There Index: Lib/tempfile.py =================================================================== --- Lib/tempfile.py (revision 62573) +++ Lib/tempfile.py (working copy) @@ -20,7 +20,7 @@ __all__ = [ "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces "SpooledTemporaryFile", - "mkstemp", "mkdtemp", # low level safe interfaces + "mkstemp", "mkdtemp", "mkstempf", # low level safe interfaces "mktemp", # deprecated unsafe interface "TMP_MAX", "gettempprefix", # constants "tempdir", "gettempdir" @@ -336,6 +336,13 @@ raise IOError, (_errno.EEXIST, "No usable temporary directory name found") + +def mkstempf(suffix="", prefix=template, dir=None, text=False): + "Like mkstemp, but returns a file object instead of a file descriptor." + fd, fname = mkstemp(suffix, prefix, dir) + f = _os.fdopen(fd, text and "w+" or "w+b") + return (f, fname) + def mktemp(suffix="", prefix=template, dir=None): """User-callable function to return a unique temporary file name. The file is not created. Index: Lib/test/test_tempfile.py =================================================================== --- Lib/test/test_tempfile.py (revision 62573) +++ Lib/test/test_tempfile.py (working copy) @@ -75,6 +75,7 @@ "NamedTemporaryFile" : 1, "TemporaryFile" : 1, "mkstemp" : 1, + "mkstempf" : 1, "mkdtemp" : 1, "mktemp" : 1, "TMP_MAX" : 1, @@ -429,6 +430,47 @@ test_classes.append(test_mkstemp) +class test_mkstempf(TC): + """Test mkstempf().""" + + def do_create(self, dir=None, pre="", suf=""): + if dir is None: + dir = tempfile.gettempdir() + try: + (f, name) = tempfile.mkstempf(dir=dir, prefix=pre, suffix=suf) + (ndir, nbase) = os.path.split(name) + adir = os.path.abspath(dir) + self.assertEqual(adir, ndir, + "Directory '%s' incorrectly returned as '%s'" % (adir, ndir)) + except: + self.failOnException("mkstemp") + + try: + self.nameCheck(name, dir, pre, suf) + finally: + f.close() + os.unlink(name) + + def test_basic(self): + # mkstemp can create files + self.do_create() + self.do_create(pre="a") + self.do_create(suf="b") + self.do_create(pre="a", suf="b") + self.do_create(pre="aa", suf=".txt") + self.do_create(dir=".") + + def test_choose_directory(self): + # mkstemp can create directories in a user-selected directory + dir = tempfile.mkdtemp() + try: + self.do_create(dir=dir) + finally: + os.rmdir(dir) + +test_classes.append(test_mkstempf) + + class test_mkdtemp(TC): """Test mkdtemp()."""