itertools ChainFromInterables反斜杠规范化?

时间:2013-12-13 10:53:04

标签: python iterable

我不久前发了一个问题:

Writing List To Text File

我能够将字典中的文件列表写入文本文件。

所以我的代码看起来像这样:

simonDuplicates = chain.from_iterable([files for files in file_dict.values() if len(files) > 1])

text_file.write("Duplicates Files:%s" % '\n'.join(simonDuplicates))

这基本上打印出目录和文件,例如:

C:/Users/Simon/Desktop/myfile.jpg

问题是正斜杠。我希望它们是反斜杠(在Windows中使用)。我尝试使用os.path.normpath,但它不起作用

simonDuplicates = chain.from_iterable([files for files in file_dict.values() if len(files) > 1])

os.path.normpath(simonDuplicates)

text_file.write("Duplicates Files:%s" % '\n'.join(simonDuplicates))

我收到以下错误:

Traceback (most recent call last):
  File "duff.py", line 125, in <module>
    os.path.normpath(duplicates)
  File "C:\Python27\lib\ntpath.py", line 402, in normpath
    path = path.replace("/", "\\")
AttributeError: 'itertools.chain' object has no attribute 'replace'

我认为它不起作用,因为我应该使用iSlice?

Martijn Pieter对这个问题的回答看起来是对的:

Troubleshooting 'itertools.chain' object has no attribute '__getitem__'

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您正尝试在chain.from_iterable上应用os.path.normpath, 它返回一个生成器对象。因此,您必须迭代直到生成器耗尽,才能获得字符串类型的完整文件名列表。

你可以像这样使用列表理解

simonDuplicates = [os.path.normpath(path) for path in chain.from_iterable(files for files in file_dict.values() if len(files) > 1)]

或者您可以使用map这样的功能

simonDuplicates = map(os.path.normpath, chain.from_iterable(files for files in file_dict.values() if len(files) > 1))