Python - 有没有办法解决'os.listdir()'因文件夹名错误返回乱码的问题?

3 投票
2 回答
747 浏览
提问于 2025-04-15 14:30

我有一个用Python写的简单脚本:

import os

def Path(SourcePath):
    for Folder in os.listdir(SourcePath):
        print "TESTING: %s" % Folder

Path("\\\\192.168.0.36\\PDFs")

当我运行这个脚本时,它会在局域网的一个远程共享文件夹中递归查找,并简单地显示找到的文件夹名称。这个共享主要包含文件夹。

问题是,如果一个文件夹的名字后面有空格,这个脚本就会显示一些乱码。

比如说,如果我在这个共享文件夹里有以下几个文件夹:

  1. "6008386 HH - Walkers Crisps"
  2. "6008157 CPP - Santas Chocolate "
  3. "6007458 SCA - Morrisons Bananas"

注意到"6008157 CPP - Santas Chocolate "这个名字后面有一个空格。运行上面的脚本后,得到的列表是:

  1. "TESTING: 6008386 HH - Walkers Crisps"
  2. "TESTING: 6EBA72~1"
  3. "TESTING: 6007458 SCA - Morrisons Bananas"

我该如何在递归远程目录时避免这个问题呢?如果'os.listdir()'能正确返回文件夹名称,我就可以修复这个文件夹名称。

有没有什么想法可以解决这个问题?

2 个回答

3

这不是无意义的文字,而是一个短文件名(8.3格式)。这个格式是Windows系统特有的,不过你可以使用 GetLongPathName() 这个函数来把它转换回长文件名。

4

Windows在通过CIFS访问文件时,如果文件名包含一些在Windows中不合法的字符,就会生成一种叫做8.3的“占位符”。

在这个例子中,你的文件名“Santas Chocolate ”后面有一个空格。Windows的文件名不能以空格结尾,所以它用一个占位符来让这个文件可以被访问。

我觉得你不能用GetLongPathName来处理这个问题,因为没有合法的长文件名可以对应,因为这本身就是一个不合法的文件名。如果你遇到这样的文件名,我认为你无法在服务器上找到它的真实名称,而且这对你帮助不大,因为你也无法用这个文件名来引用它。

撰写回答