冒号在Python中的文件名

众所周知,Windows中的文件名不能包含冒号。 但是,我遇到了一个问题,可以通过下面的示例代码进行复制:

import os os.chdir('./temp') names = ['a', 'b', 'word1: word2', 'c: file', 'd: file'] for name in names: with open(name, 'w') as f: f.write('foo') 

该脚本在./temp目录中创build三个文件: ab (带“foo”)和word1 (空)。 它还在D:\创build一个名为file ,它是可移动存储。 它不会在C:\创build任何内容,这需要pipe理员权限才能写入; 但是,它确实在当前工作目录中创build了一个文件。

我不明白三件事情:

  1. 为什么不引发任何exception(与其他禁止的字符,我得到IOError)?
  2. 为什么word1文件是空的?
  3. 为什么在当前工作目录中创build一个文件?

Windows NTFS支持文件“流”。 您基本上将数据附加到文件之外的文件,并且无法正常查看。 当您创建文件“word1:word2”时,隐藏的流“word2”被附加到“word1”。 如果您将文件word1复制到另一台NTFS计算机上,那么word2数据将随您一起提供

去这里http://technet.microsoft.com/en-us/sysinternals/bb897440.aspx并下载流程序。 运行它会告诉你,word2是附加到word1的流

这个网页还谈到流: http : //www.forensicfocus.com/dissecting-ntfs-hidden-streams

要真正证明这一点,你可以使用记事本,但是你需要使用.txt扩展名:

  file=open('word1.txt:word2.txt','w') file.write('Testing streams') file.close() 

现在,使用cmd程序,将目录更改为您创建文件的位置。 键入以下内容:

  c:\tmp> notepad word1.txt 

你会看到一个空的文件。 现在,试试这个:

  c:\tmp> notepad word1.txt:word2.txt 

您应该看到文本Testing streams