如何使用sklearn load_files方法忽略一些文件?

时间:2013-01-01 07:12:01

标签: python scikit-learn

我的mac os将在我的列车数据集文件目录下生成.DS_Store,而load_files将加载它并引发异常,如

UnicodeDecodeError:'utf8'编解码器无法解码1116位的字节0xff

我想知道除了删除它之外如何过滤.DS_Store文件?

3 个答案:

答案 0 :(得分:3)

查看documentation,似乎无法直接在load_files中过滤(或者,您可以将类别列入白名单,但不能将类别中的文件列入白名单,或任何级别的黑名单。)

您可能需要考虑向scikit-learn项目提交功能请求。或者,您可能会认为这是一个错误,隐藏文件(适用于平台 - 但在OS X和其他POSIX系统上应该包含名称以.开头的文件),并提交错误报告这一点。

同时,您可以设置load_content标志:

  

load_content:boolean,optional(default = True)

     

是否加载不同文件的内容。如果为true,则返回的数据结构中包含包含文本信息的“data”属性。如果没有,则filenames属性给出文件的路径。

通过False,它会找到您的文件名,然后您可以根据需要进行过滤(例如filenames = (filename for filename in ret.filenames if not filename.startswith('.'))),然后手动加载。

这似乎是给定工具可用的最佳解决方案。

另一方面,考虑到load_files实际上有多简单 - 特别是如果您不使用categoriesshuffle等额外功能 - 可能更简单,不使用它,而是使用os.walkos.listdir。在这种情况下,假设文件正好是2级深度,而不是任意深度,后者可能更简单:

def getfilenames(category):
    return [filename for filename in os.listdir(category)
            if not filename.endswith('.')]
categoryfiles = [getcategory(os.path.join(rootpath, category)
                 for category in os.listdir(rootpath)]

答案 1 :(得分:0)

quick glance at the source load_files显示您唯一的选择是删除.DS_Store个文件:

documents = [join(folder_path, d)
    for d in sorted(listdir(folder_path))]

(如果你想认真对待.DS_Store 污染,这里有一个严肃的内核扩展:https://github.com/binaryage/asepsis)。

答案 2 :(得分:0)

我修改了sklearn load_files以接受其他参数' ignore_files'这将接受要忽略的文件列表。您可以使用load_files的这个定义而不是sklearn。它返回与load_files相同的结果,因为我只是过滤需要忽略的文件。

用法:

load_files(dir_path,ignore_files=".DS_Store")

gist

上的来源