2014-09-10 461 views
6

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

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目录中有三个文件:ab(与“富”)和word1(空) 。它还在D:\中创建一个名为file的文件,该文件是可移动存储。它不会在C:\中创建任何内容,这需要管理员权限才能写入;但是,它确实在当前工作目录中创建了一个文件。

我不明白三两件事:

  1. 为什么不抛出任何异常(与其他禁止文字,我得到IO错误)?
  2. 为什么word1文件为空?
  3. 为什么在当前工作目录中创建文件?
+3

这与你的观点相当接近(这是一个很好的问题),但是在处理文件时请使用'with'。传播良好做法! – Veedrac 2014-09-10 20:26:17

+0

''word1:word2'存储到名为''word2''的备用NTFS流。用'dir/R word1'检查。 – eryksun 2014-09-10 20:30:54

+1

c:file''在C:驱动器的当前工作目录下创建一个名为''file''的文件。 – eryksun 2014-09-10 20:35:51

回答

8

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

去这里http://technet.microsoft.com/en-us/sysinternals/bb897440.aspx并下载流程序。运行它会告诉你,单词2是连接到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

+0

你也可以用Python读入隐藏流:'open('word1.txt :word2.txt')as f:print f.read()' – 2015-04-23 20:14:51