Thanks for help re: %userprofile%

Tim Roberts timr at probo.com
Wed Jun 11 03:09:38 EDT 2008


bsagert at gmail.com wrote:

>The python community is very helpful to newbies like me. I did however
>manage to solve my problem in the meantime. I needed  the modification
>time of certain files on various computers, but I didn't know the
>usernames ahead of time, so I used windows %userprofile% method.
>Python likes forward slashes in file names, whereas windows likes back
>slashes.

Your last sentence is not true at all.  The Windows APIs accept forward
slashes anywhere they accept backward slashes.  It is only the command
shell insists on back slashes.

>Here is my script.
>
>import os, re
>u = os.getenv("USERPROFILE")
># python returns "c:\\documents and Settings\\user"
># note the escaped backslashes which windows hates.

What???  This is not only false, it is completely backwards from what you
just said.  The string does NOT actually contain any doubled backslashes.
You only SEE that because of the way you are displaying them to your
terminal.  This string:

  x = "\\\n"

contains exactly two characters: a backslash, and a newline.  Try it and
see.

># let's repair that with re.sub
>u = re.sub( r"\\", "/", u)

That doesn't do what you think it does.  r"\\" contains two characters,
both backslashes.  However, your source string doesn't CONTAIN any doubled
backslashes.  So, this statement does nothing.

  Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on
win32
  Type "help", "copyright", "credits" or "license" for more information.
  >>> x = "\\\n"
  >>> len(x)
  2
  >>> x = "\\"    # contains one character: a backslash
  >>> len(x)
  1
  >>> x
  '\\'
  >>> x = r"\\"   # contains two characters: both backslashes
  >>> len(x)
  2
  >>> x           # but when Python displays it, it escapes them
  '\\\\'
  >>>

>f = u+"/dir1/file1"
>mod = os.path.getmtime(f)
># success, now do something

It would also have succeeded with all backslashes, or with mixed forward
and backslashes.  You're focussing on the wrong things here.

>c = "copy '%userprofile%\dir1\file1' c:\dir2\file2"
># note back slashes here which windows tolerates.

That is WRONG, and it only worked by accident.  If your directory names had
been "index" or "name", you would have found this out.  The correct way to
write that is either:
  c = "copy '%USERPROFILE%\\dir1\\file1' c:\\dir2\\file2"
or
  c = r"copy '%USERPROFILE%\dir1\file1' c:\dir2\file2"
  

># In the os.system context, python delivers unescaped slashes.
>os.system(c)
># success

There is no reason to go to an external program for this at all.  Just do
this:
  import shutil
  shutil.copyfile( sourcefilename, destfilename )

>I'm a retired old fart trying to learn python so I welcome criticism
>and advice.

Tell us what you are really trying to do, and we can offer some simple
scripts that you can use as an example.
-- 
Tim Roberts, timr at probo.com
Providenza & Boekelheide, Inc.



More information about the Python-list mailing list