<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Martin v. L&ouml;wis wrote:
<blockquote cite="mid45ED83A4.80604@v.loewis.de" type="cite">
  <pre wrap="">Ok - now I'm confused: do you consider this behavior 
(splitext('.pythonrc') == ('', '.pythonrc')) correct
or not?
  </pre>
</blockquote>
<br>
+1 on the behavior.&nbsp; However, the patch is special-casing a leading
dot; it would still fail on splitext("..").&nbsp; If we're gonna fix the
bug, I'd rather we fixed it dead.<br>
<br>
What follows is a cross-platform splitext().&nbsp; It passes all the tests I
threw at it, also attached.&nbsp; If there is interest, I would be happy to
submit it as an alternate patch.&nbsp; If runtime speed is paramount, I
could lose the portability, and instead port my patch into all three
*path.py files natively (dropping os.sep and os.altsep).<br>
<br>
Hope this helps,<br>
<br>
<br>
<i>larry</i><br>
----------<br>
import os<br>
<br>
def splitext(f):<br>
&nbsp; sepIndex = f.rfind(os.sep)<br>
&nbsp; if os.altsep:<br>
&nbsp;&nbsp;&nbsp; altsepIndex = f.rfind(os.altsep)<br>
&nbsp;&nbsp;&nbsp; sepIndex = max(sepIndex, altsepIndex)<br>
<br>
&nbsp; dotIndex = f.rfind(".")<br>
&nbsp; if dotIndex &gt; sepIndex:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # skip all leading dots<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filenameIndex = sepIndex + 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while filenameIndex &lt; dotIndex:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if f[filenameIndex] != '.':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f[:dotIndex], f[dotIndex:]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filenameIndex += 1<br>
<br>
&nbsp; return f, ''<br>
<br>
<br>
def splitextTest(path, filename, ext):<br>
&nbsp; assert splitext(path) == (filename, ext)<br>
&nbsp; assert splitext(os.sep + path) == (os.sep + filename, ext)<br>
&nbsp; assert splitext("abc" + os.sep + path) == ("abc" + os.sep + filename,
ext)<br>
&nbsp; assert splitext("abc.def" + os.sep + path) == ("abc.def" + os.sep +
filename, ext)<br>
&nbsp; if os.altsep:<br>
&nbsp;&nbsp;&nbsp; assert splitext(os.altsep + path) == (os.altsep + filename, ext)<br>
&nbsp;&nbsp;&nbsp; assert splitext("abc" + os.altsep + path) == ("abc" + os.altsep +
filename, ext)<br>
&nbsp;&nbsp;&nbsp; assert splitext("abc.def" + os.altsep + path) == ("abc.def" +
os.altsep + filename, ext)<br>
<br>
<br>
splitextTest("foo.bar", "foo", ".bar")<br>
splitextTest("foo.boo.bar", "foo.boo", ".bar")<br>
splitextTest("foo.boo.biff.bar", "foo.boo.biff", ".bar")<br>
splitextTest(".csh.rc", ".csh", ".rc")<br>
splitextTest("nodots", "nodots", "")<br>
splitextTest(".cshrc", ".cshrc", "")<br>
splitextTest("...manydots", "...manydots", "")<br>
splitextTest("...manydots.ext", "...manydots", ".ext")<br>
splitextTest(".", ".", "")<br>
splitextTest("..", "..", "")<br>
splitextTest("........", "........", "")<br>
<i></i>
</body>
</html>