我很想在Windows下的Python脚本中在unicode命名文件夹之间移动一个名为unicode的文件...
您将使用什么语法查找文件夹中* .ext类型的所有文件并将其移动到相对位置?
假设文件和文件夹是unicode。
答案 0 :(得分:15)
基本问题是Unicode和字节字符串之间的未转换混合。解决方案可以转换为单一格式或使用一些技巧避免问题。我的所有解决方案都包含glob
和shutil
标准库。
为了举例,我有一些以ods
结尾的Unicode文件名,我想将它们移动到名为א
的子目录(希伯来语Aleph,一个unicode字符)。
>>> import glob
>>> import shutil
>>> files=glob.glob('*.ods') # List of Byte string file names
>>> for file in files:
... shutil.copy2(file, 'א') # Byte string directory name
...
>>> import glob
>>> import shutil
>>> files=glob.glob(u'*.ods') # List of Unicode file names
>>> for file in files:
... shutil.copy2(file, u'א') # Unicode directory name
归功于Ezio Melotti,Python bug list。
虽然这不是我认为最好的解决方案,但这里有一个值得一提的好方法。
使用os.getcwd()
将目录更改为目标目录,然后将文件称为.
将文件复制到目标目录:
# -*- coding: utf-8 -*-
import os
import shutil
import glob
os.chdir('א') # CD to the destination Unicode directory
print os.getcwd() # DEBUG: Make sure you're in the right place
files=glob.glob('../*.ods') # List of Byte string file names
for file in files:
shutil.copy2(file, '.') # Copy each file
# Don't forget to go back to the original directory here, if it matters
直截了当的方法shutil.copy2(src, dest)
失败,因为shutil
将一个unicode与ASCII字符串连接而没有转换:
>>> files=glob.glob('*.ods')
>>> for file in files:
... shutil.copy2(file, u'א')
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/usr/lib/python2.6/shutil.py", line 98, in copy2
dst = os.path.join(dst, os.path.basename(src))
File "/usr/lib/python2.6/posixpath.py", line 70, in join
path += '/' + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 1:
ordinal not in range(128)
如前所述,使用'א'
代替Unicode u'א'
在我看来,这是错误,因为Python不能指望basedir
名称总是str
,而不是unicode
。我有reported this as an issue in the Python buglist,等待回复。
答案 1 :(得分:3)
在任何地方使用Unicode字符串:
# -*- coding: utf-8 -*-
# source code ^^ encoding; it might be different from sys.getfilesystemencoding()
import glob
import os
srcdir = u'مصدر الدليل' # <-- unicode string
dstdir = os.path.join('..', u'κατάλογο προορισμού') # relative path
for path in glob.glob(os.path.join(srcdir, u'*.ext')):
newpath = os.path.join(dstdir, os.path.basename(path))
os.rename(path, newpath) # move file or directory; assume the same filesystem
移动文件中有许多微妙的细节;见shutit.copy*
函数。您可以使用适合您特定情况的一个,并在成功时移除源文件,例如,通过os.remove()
。