2014-09-10 460 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