[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

Chinese character error

John Deas

2/8/2008 9:29:00 AM

Hi,

I made a small script to recursively copy files from a directory tree
to an exportDir only if they have an mp3 extension :

a=os.walk(os.getcwd())
for root, dirs, files in a:
for currFile in files:
pathCurrFile=os.path.join(root, currFile)
if mp3Reg.search(pathCurrFile):
shutil.copy(pathCurrFile,exportDir)
else:
print pathCurrFile

The problem is that I get stuck with files containing name in
Chinese :

Traceback (most recent call last):
File "/cygdrive/c/Documents and Settings/vku/Mes documents/Ma
musique/iTunes/i
Tunes Music/script.py", line 21, in <module>
shutil.copy(pathCurrFile,exportDir)
File "/usr/lib/python2.5/shutil.py", line 80, in copy
copyfile(src, dst)
File "/usr/lib/python2.5/shutil.py", line 46, in copyfile
fsrc = open(src, 'rb')
IOError: [Errno 2] No such file or directory: '/cygdrive/c/Documents
and Setting
s/vku/Mes documents/Ma musique/iTunes/iTunes Music/Podcasts/Learn
Chinese - Chin
esePod/785 Advanced - ????.mp3'

I am using python on cygwin, so could this be the source of the error,
and is there a way to fix this ?
5 Answers

Chris

2/8/2008 10:12:00 AM

0

On Feb 8, 11:29 am, John Deas <john.d...@gmail.com> wrote:
> Hi,
>
> I made a small script to recursively copy files from a directory tree
> to an exportDir only if they have an mp3 extension :
>
> a=os.walk(os.getcwd())
> for root, dirs, files in a:
> for currFile in files:
> pathCurrFile=os.path.join(root, currFile)
> if mp3Reg.search(pathCurrFile):
> shutil.copy(pathCurrFile,exportDir)
> else:
> print pathCurrFile
>
> The problem is that I get stuck with files containing name in
> Chinese :
>
> Traceback (most recent call last):
> File "/cygdrive/c/Documents and Settings/vku/Mes documents/Ma
> musique/iTunes/i
> Tunes Music/script.py", line 21, in <module>
> shutil.copy(pathCurrFile,exportDir)
> File "/usr/lib/python2.5/shutil.py", line 80, in copy
> copyfile(src, dst)
> File "/usr/lib/python2.5/shutil.py", line 46, in copyfile
> fsrc = open(src, 'rb')
> IOError: [Errno 2] No such file or directory: '/cygdrive/c/Documents
> and Setting
> s/vku/Mes documents/Ma musique/iTunes/iTunes Music/Podcasts/Learn
> Chinese - Chin
> esePod/785 Advanced - ????.mp3'
>
> I am using python on cygwin, so could this be the source of the error,
> and is there a way to fix this ?

It has to do with the way the OS reports the filename. Explorers GUI
diplays it as square blocks and both CmdPrompt + Cygwin display it as
Question marks as does the os.listdir in Python. Copying Chinese
Characters and checking their Ordinal Values directly from python gave
me for eg. 230+188+162 for 1 Chinese Charater yet Python shows it is
Ordinal 63 (a Question Mark) after reading the filename.

Those files you will need to manually copy, I even tried
find /cygdrive/d/Temp/ -name "*.mp3" -exec cp {} /cygdrive/d/Temp/
test/ \;
which yielded
cp: cannot stat '/cygdrive/d/Temp/??.mp3': No such file or directory

Mark Tolonen

2/9/2008 2:01:00 AM

0


"Chris" <cwitts@gmail.com> wrote in message
news:0d61dcee-5102-4d35-9b74-9538335d33ca@l32g2000hse.googlegroups.com...
> On Feb 8, 11:29 am, John Deas <john.d...@gmail.com> wrote:
>> Hi,
>>
>> I made a small script to recursively copy files from a directory tree
>> to an exportDir only if they have an mp3 extension :
>>
>> a=os.walk(os.getcwd())
>> for root, dirs, files in a:
>> for currFile in files:
>> pathCurrFile=os.path.join(root, currFile)
>> if mp3Reg.search(pathCurrFile):
>> shutil.copy(pathCurrFile,exportDir)
>> else:
>> print pathCurrFile
>>
>> The problem is that I get stuck with files containing name in
>> Chinese :
>>
>> Traceback (most recent call last):
>> File "/cygdrive/c/Documents and Settings/vku/Mes documents/Ma
>> musique/iTunes/i
>> Tunes Music/script.py", line 21, in <module>
>> shutil.copy(pathCurrFile,exportDir)
>> File "/usr/lib/python2.5/shutil.py", line 80, in copy
>> copyfile(src, dst)
>> File "/usr/lib/python2.5/shutil.py", line 46, in copyfile
>> fsrc = open(src, 'rb')
>> IOError: [Errno 2] No such file or directory: '/cygdrive/c/Documents
>> and Setting
>> s/vku/Mes documents/Ma musique/iTunes/iTunes Music/Podcasts/Learn
>> Chinese - Chin
>> esePod/785 Advanced - ????.mp3'
>>
>> I am using python on cygwin, so could this be the source of the error,
>> and is there a way to fix this ?
>
> It has to do with the way the OS reports the filename. Explorers GUI
> diplays it as square blocks and both CmdPrompt + Cygwin display it as
> Question marks as does the os.listdir in Python. Copying Chinese
> Characters and checking their Ordinal Values directly from python gave
> me for eg. 230+188+162 for 1 Chinese Charater yet Python shows it is
> Ordinal 63 (a Question Mark) after reading the filename.
>
> Those files you will need to manually copy, I even tried
> find /cygdrive/d/Temp/ -name "*.mp3" -exec cp {} /cygdrive/d/Temp/
> test/ \;
> which yielded
> cp: cannot stat '/cygdrive/d/Temp/??.mp3': No such file or directory

If you call os.walk() with a Unicode string, it's return values will be
Unicode as well and you should be able to process files with non-ASCII
characters. This worked for me (on Windows):

import os
import shutil
import fnmatch

exportDir = u'c:\\mp3s'

a=os.walk(os.getcwdu()) # Unicode version of os.getcwd()
for root, dirs, files in a:
for currFile in files:
pathCurrFile=os.path.join(root, currFile)
if fnmatch.fnmatch(pathCurrFile,u'*.mp3'):
shutil.copy(pathCurrFile,exportDir)
else:
print pathCurrFile

--Mark

John Deas

2/10/2008 10:38:00 PM

0

On Feb 9, 3:00 am, "Mark Tolonen" <mark.e.tolo...@mailinator.com>
wrote:
> "Chris" <cwi...@gmail.com> wrote in message
>
> news:0d61dcee-5102-4d35-9b74-9538335d33ca@l32g2000hse.googlegroups.com...
>
>
>
> > On Feb 8, 11:29 am, John Deas <john.d...@gmail.com> wrote:
> >> Hi,
>
> >> I made a small script to recursively copy files from a directory tree
> >> to an exportDir only if they have an mp3 extension :
>
> >> a=os.walk(os.getcwd())
> >> for root, dirs, files in a:
> >> for currFile in files:
> >> pathCurrFile=os.path.join(root, currFile)
> >> if mp3Reg.search(pathCurrFile):
> >> shutil.copy(pathCurrFile,exportDir)
> >> else:
> >> print pathCurrFile
>
> >> The problem is that I get stuck with files containing name in
> >> Chinese :
>
> >> Traceback (most recent call last):
> >> File "/cygdrive/c/Documents and Settings/vku/Mes documents/Ma
> >> musique/iTunes/i
> >> Tunes Music/script.py", line 21, in <module>
> >> shutil.copy(pathCurrFile,exportDir)
> >> File "/usr/lib/python2.5/shutil.py", line 80, in copy
> >> copyfile(src, dst)
> >> File "/usr/lib/python2.5/shutil.py", line 46, in copyfile
> >> fsrc = open(src, 'rb')
> >> IOError: [Errno 2] No such file or directory: '/cygdrive/c/Documents
> >> and Setting
> >> s/vku/Mes documents/Ma musique/iTunes/iTunes Music/Podcasts/Learn
> >> Chinese - Chin
> >> esePod/785 Advanced - ????.mp3'
>
> >> I am using python oncygwin, so could this be the source of the error,
> >> and is there a way to fix this ?
>
> > It has to do with the way the OS reports the filename. Explorers GUI
> > diplays it as square blocks and both CmdPrompt +Cygwindisplay it as
> > Question marks as does the os.listdir in Python. Copying Chinese
> > Characters and checking their Ordinal Values directly from python gave
> > me for eg. 230+188+162 for 1 Chinese Charater yet Python shows it is
> > Ordinal 63 (a Question Mark) after reading the filename.
>
> > Those files you will need to manually copy, I even tried
> > find /cygdrive/d/Temp/ -name "*.mp3" -exec cp {} /cygdrive/d/Temp/
> > test/ \;
> > which yielded
> > cp: cannot stat '/cygdrive/d/Temp/??.mp3': No such file or directory
>
> If you call os.walk() with a Unicode string, it's return values will be
> Unicode as well and you should be able to process files with non-ASCII
> characters. This worked for me (on Windows):
>
> import os
> import shutil
> import fnmatch
>
> exportDir = u'c:\\mp3s'
>
> a=os.walk(os.getcwdu()) # Unicode version of os.getcwd()
> for root, dirs, files in a:
> for currFile in files:
> pathCurrFile=os.path.join(root, currFile)
> if fnmatch.fnmatch(pathCurrFile,u'*.mp3'):
> shutil.copy(pathCurrFile,exportDir)
> else:
> print pathCurrFile
>
> --Mark

Hi,

I tried to play around with the advice you gave me.

When I do this in the directory containing an unicode-named mp3:

import os, shutil
os.listdir(os.getcwdu())

I get :

[u'The Pixies - Where is my mind (fight club).mp3', u'???.mp3']

Than, if try to copy it with :

shutil.copy(os.listdir(os.getcwdu())[1],u'test.mp3')

I get :

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/shutil.py", line 80, in copy
copyfile(src, dst)
File "/usr/lib/python2.5/shutil.py", line 46, in copyfi
fsrc = open(src, 'rb')
IOError: [Errno 2] No such file or directory: u'???.mp3'

Have you any idea why this is not working on my computer ?

Tanks,

John Deas

Martin v. Loewis

2/11/2008 5:52:00 AM

0

> Have you any idea why this is not working on my computer ?

Can you please try the listdir operation with the Python distribution
from python.org instead of Cygwin Python?

Regards,
Martin

John Deas

2/13/2008 8:12:00 PM

0

On Feb 11, 6:51 am, "Martin v. Löwis" <mar...@v.loewis.de> wrote:
> > Have you any idea why this is not working on my computer ?
>
> Can you please try the listdir operation with the Python distribution
> from python.org instead ofCygwinPython?
>
> Regards,
> Martin

it works. Thanks.