当前位置: 首页 > 面试题库 >

Python:如何将具有Unicode文件名的文件移动到Unicode文件夹

邢硕
2023-03-14
问题内容

我在Windows下的Python脚本中在以unicode命名的文件夹之间移动以unicode命名的文件时遇到了麻烦…

您将使用什么语法在文件夹中查找* .ext类型的所有文件并将其移至相对位置?

假设文件和文件夹是unicode。


问题答案:

基本问题是Unicode和字节字符串之间未转换的混合。解决方案可以转换为单一格式,也可以避免一些麻烦而避免出现问题。我所有的解决方案都包含globshutil标准库。

举例来说,我有一些以结尾的Unicode文件名ods,我想将它们移动到名为א(希伯来语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
...

第二种解决方案-将文件名转换为Unicode:

>>> 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错误列表。

第三种解决方案-避免目标Unicode目录名称

尽管这并不是我认为的最佳解决方案,但这里有个不错的技巧值得一提。

使用将目录更改为目标目录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用ASCII字符串连接了Unicode而不进行转换:

>>> 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。我在Python
Buglist中报告了这个问题
,并等待响应。

进一步阅读

Python的官方Unicode
HOWTO



 类似资料:
  • 我有一个包含10个图像的文件夹,我希望根据其当前文件名将其移动到一个新文件夹中。我已经成功地将文件夹中的每个图像移动到了一个新文件夹中,到目前为止,我已经成功地将每个图像文件名移动到了它自己的文件夹中,但我还没有弄清楚如何将具有相同文件名的所有图像移动到一个文件夹中,然后将另一个移动到另一个文件夹中。例如,下面我想相应地移动图像。 1600_01.jpg--- 到目前为止,这是我的代码,通过根据图

  • 问题内容: 我正在从Google文档中提取数据,进行处理,然后将其写入文件(最终我将其粘贴到Wordpress页面中)。 它具有一些非ASCII符号。如何将这些安全地转换为可以在HTML源代码中使用的符号? 目前,我正在将所有内容都转换为,将它们全部合并为Python字符串,然后执行以下操作: 最后一行存在编码错误: 编解码器无法解码位置12286的字节:序数不在范围内(128) 部分解决方案:

  • 我正在使用twitter python库从公共流中获取一些推文。该库以json格式获取推文并将其转换为python结构。我正在尝试做的是直接获取json字符串并将其写入文件。在twitter库中,它首先读取网络套接字并将应用到缓冲区。然后,它将信息包装在python结构中并返回。我可以使用将其编码回json字符串并将其保存到文件中。但是我想字符编码有问题。当我尝试打印json字符串时,它在控制台中

  • 问题内容: 我正在尝试将不同语言的字符串写入rtf文件。我尝试了一些不同的东西。我在这里以日语为例,但是我尝试过的其他语言也是如此。 我还尝试过: 或更具体: 输出流还具有writeUTF方法: 您可以使用write方法在输出流中直接使用byte []。以上所有内容使我发现西欧语言以外的所有字符都乱码。为了查看它是否有效,我尝试在notepad ++中打开结果文档并设置适当的编码。我也使用过Ope

  • 问题内容: 我正在学习如何在Python中打开文件,但是当我键入要打开的文件的路径时,会弹出一个窗口,说“(unicode错误)’unicodeescape编解码器无法解码位置2-3的字节:被截断的\ UXXXXXXXX转义”。它突出显示了我的第一个括号。这是代码: 问题答案: 一个明显的问题是您使用的是普通字符串,而不是原始字符串。在 会被解释为制表符,而不是文字反斜杠,其后是。 使用以下之一:

  • 我最近发现,默认情况下,Amazon S3会使名称中带有Unicode的文件通过以UTF-8以分解Unicode标准格式进行百分比编码的URL可用。 然而,我不确定它是NFD还是NFKD,我怀疑我可能会不小心选错一个,然后逃脱一段时间,直到某个地方出现一个奇怪的字符时,东西坏了。在亚马逊上找不到这个记录。 过去有人发现过这一点吗? 非常感谢!