473,387 Members | 1,757 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

removing spaces from front and end of filenames

This script works as I expect, except for the last section. I want the
last section to actually remove all spaces from the front and/or end of
filenames. For example, a file that was named " test " would be
renamed "test" (the 2 spaces before and after the filename removed). Any
suggestions on how to do this?

import os, re, string
print " "
print "--- Remove '%2f' From Filenames ---"
print " "
percent2f = re.compile('%2f') #look for this exact string.
for root, dirs, files in os.walk('/home/rbt/scripts'):
for file in files:
badchars = percent2f.findall(file)
newfile = ''
for badchar in badchars:
newfile = file.replace(badchar,'-') #replace %2f with a -
if newfile:
newpath = os.path.join(root,newfile)
oldpath = os.path.join(root,file)
os.rename(oldpath,newpath)
print oldpath
print newpath
print " "
print "--- Done ---"
print " "
print "--- Remove Bad Characters From Filenames ---"
print " "
badcharset = re.compile(r'[*?<>/\|\\]') #remove any occurance of *?<>/|\
for root, dirs, files in os.walk('/home/rbt/scripts/'):
for file in files:
badchars = badcharset.findall(file)
newfile = ''
for badchar in badchars:
newfile = file.replace(badchar,'-') #replace with a dash.
if newfile:
newpath = os.path.join(root,newfile)
oldpath = os.path.join(root,file)
os.rename(oldpath,newpath)
print oldpath
print newpath
print " "
print "--- Done ---"
print " "
print "--- Remove Spaces From Filenames ---"
print " "
for root, dirs, files in os.walk('/home/rbt/scripts'):
for file in files:
fname = (file)
fname = fname.strip( )
print fname
print " "
print "--- Done ---"
print " "

Jul 18 '05 #1
9 6709
hokiegal99 wrote:
This script works as I expect, except for the last section. I want the
last section to actually remove all spaces from the front and/or end
of
filenames. For example, a file that was named " test " would be
renamed "test" (the 2 spaces before and after the filename removed).
Any
suggestions on how to do this?


That's what the .strip method, which is what you're using, does. If
it's not working for you you're doing something else wrong.

--
Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/
__ San Jose, CA, USA && 37 20 N 121 53 W && &tSftDotIotE
/ \ The meaning of life is that it stops.
\__/ Franz Kafka
Jul 18 '05 #2
On Sat, 12 Jul 2003 21:42:56 -0400, hokiegal99
<ho********@hotmail.com> wrote:
This script works as I expect, except for the last section. I want the
last section to actually remove all spaces from the front and/or end of
filenames. For example, a file that was named " test " would be
renamed "test" (the 2 spaces before and after the filename removed). Any
suggestions on how to do this?
....
for file in files:
fname = (file)
fname = fname.strip( )
print fname


The indentation here looks suspicious. It is a very bad idea to indent
some lines with tabs and others with spaces - use one method or the
other.

Also, you are not saving the stripped versions of the strings
anywhere.

BTW - the strip method doesn't change the object in place, so I don't
see the point of the 'fname = (file)' line. I certainly don't
understand the brackets. In fact, why not just...

files = [i.strip() for i in files]

My best guess is that you expected the 'file' variable to reference
into the list, but this won't happen - its one of those things that
depends on whether the values are mutable or immutable, and with for
loops it's the type of the items within the list (ie the strings) that
is important. Strings are immutable.

Yes, this mutable/immutable thing is a pain :-(

Anyway, if you don't like list comprehensions, you'll need to loop
through the indices using something like...

for i in range(len(files)) :
files[i] = files[i].strip ()

Hope this helps.

Jul 18 '05 #3
On 13 Jul 2003 08:44:05 -0700, ho********@hotmail.com (hokiegal99)
wrote:
Erik Max Francis <ma*@alcyone.com> wrote in message news:<3F***************@alcyone.com>...
hokiegal99 wrote:
> This script works as I expect, except for the last section. I want the
> last section to actually remove all spaces from the front and/or end
> of
> filenames. For example, a file that was named " test " would be
> renamed "test" (the 2 spaces before and after the filename removed).
> Any
> suggestions on how to do this?


That's what the .strip method, which is what you're using, does. If
it's not working for you you're doing something else wrong.


for root, dirs, files in os.walk('/home/rbt/scripts'):
for file in files:
fname = (file)
fname = fname.strip( )
print fname

When I print fname, it prints the filenames w/o spaces (a file named "
test " looks like "test"), but when I ls the actual files in the
directory they still contain spaces at both ends. That's what I don't
understand. It seems that .strip is ready to remove the spaces, but
that it needs one more step to actually do so. Any ideas?


If you mean looking at the list, the stripped results aren't in there
because you didn't put them there. See my other reply.

If you literally mean 'in the directory' (ie looking using a file
browser) you need to do yet another step - to apply the stripped names
back to the files using the 'os.rename' function. I'm not familiar
with os.walk and can't find the documentation, so the following is
probably wrong, but I'd suggest something like...

for root, dirs, files in os.walk('/home/rbt/scripts'):
for file in files:
os.rename(file, file.strip ())

This does seem very unlikely, though.

Jul 18 '05 #4
Ha!!

Fixed it with this bit of code:

for root, dirs, files in os.walk('/home/BradTill/python'):
for file in files:
fname = (file)
fname = fname.strip( )
newfile = fname
if newfile:
newpath = os.path.join(root,newfile)
oldpath = os.path.join(root,file)
os.rename(oldpath,newpath)
print oldpath
print newpath

Below is a sample of how the script acts on filenames:

--- Remove '%2f' From Filenames ---

/home/BradTill/python/ %2fbad%2fmac%2ffile>
/home/BradTill/python/ -bad-mac-file>
/home/BradTill/python/-target1-/ %2fbad%2fmac%2ffile|
/home/BradTill/python/-target1-/ -bad-mac-file|
/home/BradTill/python/-target1-/-target2-/ %2fbad%2fmac%2ffile?
/home/BradTill/python/-target1-/-target2-/ -bad-mac-file?
/home/BradTill/python/-target1-/-target2-/-target3-/
%2fbad%2fmac%2ffile\
/home/BradTill/python/-target1-/-target2-/-target3-/ -bad-mac-file\

--- Done ---

--- Remove Bad Characters From Filenames ---

/home/BradTill/python/ -bad-mac-file>
/home/BradTill/python/ -bad-mac-file-
/home/BradTill/python/-target1-/ -bad-mac-file|
/home/BradTill/python/-target1-/ -bad-mac-file-
/home/BradTill/python/-target1-/-target2-/ -bad-mac-file?
/home/BradTill/python/-target1-/-target2-/ -bad-mac-file-
/home/BradTill/python/-target1-/-target2-/-target3-/ -bad-mac-file\
/home/BradTill/python/-target1-/-target2-/-target3-/ -bad-mac-file-

--- Done ---

--- Remove Spaces From Filenames ---

/home/BradTill/python/fix_files.py
/home/BradTill/python/fix_files.py
/home/BradTill/python/fix_dirs.py
/home/BradTill/python/fix_dirs.py
/home/BradTill/python/files
/home/BradTill/python/files
/home/BradTill/python/ -bad-mac-file-
/home/BradTill/python/-bad-mac-file-
/home/BradTill/python/-target1-/ -bad-mac-file-
/home/BradTill/python/-target1-/-bad-mac-file-
/home/BradTill/python/-target1-/-target2-/ -bad-mac-file-
/home/BradTill/python/-target1-/-target2-/-bad-mac-file-
/home/BradTill/python/-target1-/-target2-/-target3-/ -bad-mac-file-
/home/BradTill/python/-target1-/-target2-/-target3-/-bad-mac-file-

--- Done ---

Works well on dirs too, except that the path changes when a fix is
made to a parent dir so the script has to be run over and over until
all sub dirs are fixed.
Jul 18 '05 #5
On Sun, Jul 13, 2003 at 08:44:05AM -0700, hokiegal99 wrote:
Erik Max Francis <ma*@alcyone.com> wrote in message news:<3F***************@alcyone.com>...
hokiegal99 wrote:
This script works as I expect, except for the last section. I want the
last section to actually remove all spaces from the front and/or end
of
filenames. For example, a file that was named " test " would be
renamed "test" (the 2 spaces before and after the filename removed).
Any
suggestions on how to do this?


That's what the .strip method, which is what you're using, does. If
it's not working for you you're doing something else wrong.


for root, dirs, files in os.walk('/home/rbt/scripts'):
for file in files:
fname = (file)
fname = fname.strip( )
print fname

When I print fname, it prints the filenames w/o spaces (a file named "
test " looks like "test"), but when I ls the actual files in the
directory they still contain spaces at both ends. That's what I don't
understand. It seems that .strip is ready to remove the spaces, but
that it needs one more step to actually do so. Any ideas?


Surely you need to actually rename the file:
for root, dirs, files in os.walk('/home/rbt/scripts'):
for name in files:
newname = name.strip()
if newname != name: os.rename(name, newname)

Jeff

Jul 18 '05 #6
hokiegal99 wrote:
for root, dirs, files in os.walk('/home/rbt/scripts'):
for file in files:
fname = (file)
fname = fname.strip( )
print fname

When I print fname, it prints the filenames w/o spaces (a file named "
test " looks like "test"), but when I ls the actual files in the
directory they still contain spaces at both ends. That's what I don't
understand. It seems that .strip is ready to remove the spaces, but
that it needs one more step to actually do so. Any ideas?


I'm puzzled as to why you find this result confusing. You're getting a
list of files, and putting their names (as strings) into a variable.
You're then stripping the spaces from that variable and printing it.
That doesn't have any effect on the file, because you're manipulating a
string containing the file_name_, not the file itself. If you want to
rename the file, you need to do something like

oldFilename = ...
newFilename = oldFilename.strip()
os.rename(oldFilename, newFilename)

--
Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/
__ San Jose, CA, USA && 37 20 N 121 53 W && &tSftDotIotE
/ \ Life is a zoo in a jungle.
\__/ Peter de Vries
Jul 18 '05 #7
On 13 Jul 2003 08:44:05 -0700, ho********@hotmail.com (hokiegal99) wrote:
Erik Max Francis <ma*@alcyone.com> wrote in message news:<3F***************@alcyone.com>...
hokiegal99 wrote:
> This script works as I expect, except for the last section. I want the
> last section to actually remove all spaces from the front and/or end
> of
> filenames. For example, a file that was named " test " would be
> renamed "test" (the 2 spaces before and after the filename removed).
> Any
> suggestions on how to do this?


That's what the .strip method, which is what you're using, does. If
it's not working for you you're doing something else wrong.


for root, dirs, files in os.walk('/home/rbt/scripts'):
for file in files:
fname = (file)
fname = fname.strip( )
print fname

When I print fname, it prints the filenames w/o spaces (a file named "
test " looks like "test"), but when I ls the actual files in the
directory they still contain spaces at both ends. That's what I don't
understand. It seems that .strip is ready to remove the spaces, but
that it needs one more step to actually do so. Any ideas?

I don't see where you rename " test " to "test" ;-)

BTW, file is a builtin name for the file class, which creates open file objects,
so it's best to use another name.

Maybe change that last loop to (untested!)

for root, dirs, files in os.walk('/home/rbt/scripts'):
for fname in files:
newfile = fname.strip( )
if newfile != fname:
newpath = os.path.join(root,newfile)
oldpath = os.path.join(root,fname)
os.rename(oldpath,newpath)
print `oldpath` # back ticks to print repr to make sure you can see spaces
print `newpath`

Regards,
Bengt Richter
Jul 18 '05 #8
Bengt Richter wrote:
On 13 Jul 2003 08:44:05 -0700, ho********@hotmail.com (hokiegal99) wrote:

Erik Max Francis <ma*@alcyone.com> wrote in message news:<3F***************@alcyone.com>...
hokiegal99 wrote:
This script works as I expect, except for the last section. I want the
last section to actually remove all spaces from the front and/or end
of
filenames. For example, a file that was named " test " would be
renamed "test" (the 2 spaces before and after the filename removed).
Any
suggestions on how to do this?

That's what the .strip method, which is what you're using, does. If
it's not working for you you're doing something else wrong.


for root, dirs, files in os.walk('/home/rbt/scripts'):
for file in files:
fname = (file)
fname = fname.strip( )
print fname

When I print fname, it prints the filenames w/o spaces (a file named "
test " looks like "test"), but when I ls the actual files in the
directory they still contain spaces at both ends. That's what I don't
understand. It seems that .strip is ready to remove the spaces, but
that it needs one more step to actually do so. Any ideas?


I don't see where you rename " test " to "test" ;-)

BTW, file is a builtin name for the file class, which creates open file objects,
so it's best to use another name.

Maybe change that last loop to (untested!)

for root, dirs, files in os.walk('/home/rbt/scripts'):
for fname in files:
newfile = fname.strip( )
if newfile != fname:
newpath = os.path.join(root,newfile)
oldpath = os.path.join(root,fname)
os.rename(oldpath,newpath)
print `oldpath` # back ticks to print repr to make sure you can see spaces
print `newpath`

Regards,
Bengt Richter


I've found the below code to OK, does anyone see any problems with it?
I've ran it several times w/o damaging anything ;). The only problem
with doing this on dirs is that the script doesn't act on dirs within
dirs that are being renamed by the script as the path didn't exist when
the script started running. So, I have to run it several times. It works
but it's a bit of a kludge. Anyone know of a work around for this?
for root, dirs, files in os.walk('/home/rbt/test'):
for dir in dirs:
old_dname = (dir)
new_dname = old_dname.strip( )
newdir = new_dname
if newdir <> old_dname:
newpath = os.path.join(root,newdir)
oldpath = os.path.join(root,dir)
os.rename(oldpath,newpath)
print oldpath
print newpath

Jul 18 '05 #9
On 13 Jul 2003 09:43:46 -0700, ho********@hotmail.com (hokiegal99) wrote:
Ha!!

Fixed it with this bit of code:

for root, dirs, files in os.walk('/home/BradTill/python'):
for file in files:
fname = (file)
fname = fname.strip( )
newfile = fname
if newfile: for fname in files:
newfile = fname.strip()
if newfile!=fname: newpath = os.path.join(root,newfile)
oldpath = os.path.join(root,file)
os.rename(oldpath,newpath)
print oldpath
print newpath

I'd suggest using four spaces instead of tabs ;-)

Why not do the whole thing in one loop? (Ignore my prev post suggestion for final
renaming loop just for spaces):

#XXX# untested !!
import re, os
percent2f_n_bad = re.compile(r'%2f|[*?<>/|\\]') # look for bad chars too
for root, dirs, files in os.walk('/home/rbt/scripts'):
for fname in files:
newfile = percent2f_n_bad.sub('-', fname)
newfile.strip() # and the space thing
if newfile != fname: # you really only need to know if something changed, right?
newpath = os.path.join(root,newfile)
oldpath = os.path.join(root,fname)
os.rename(oldpath,newpath)
print `oldpath` # backticks to get quoted repr, to see spaces
print `newpath`

Or am I missing something?

Regards,
Bengt Richter
Jul 18 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: BJB | last post by:
I am trying to get my php script to display an image from a directory from other than the webservers root directory This doesnt work: header('Content-Type: image/jpg'); readfile("/blah/foo...
12
by: Magix | last post by:
Hi, Everytime I received a fix-length of string, let say 15 (the unused portion will filled with Spaces before receive), I want to remove the Spaces from END until I encounter a non-space char....
9
by: sdb1031 | last post by:
I am trying to run an exe within a python script, but I'm having trouble with spaces in the directory name. The following example will display the usage statement of the program, so I know that...
22
by: rtilley | last post by:
# Spaces are present before and after the XXX filename = ' XXX ' new_filename = filename.strip() if new_filename != filename: print filename Macs allow these spaces in file and folder...
40
by: raphfrk | last post by:
I have a program which reads in 3 filenames from the command line prog filename1 filename2 filename3 However, it doesn't work when one of the filenames has spaces in it (due to a directory...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.