Python中文件名中的冒号

Python中文件名中的冒号,python,windows,filenames,ioerror,Python,Windows,Filenames,Ioerror,众所周知,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目录中创建三个文件:a、b(带“foo”)和word

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

我不明白三件事:

  • 为什么没有抛出任何异常(对于其他禁止字符,我得到IOError)
  • 为什么
    word1
    文件是空的
  • 为什么在当前工作目录中创建文件

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

    到这里下载streams程序。运行它将向您显示word2是附加到word1的流

    本页还讨论了流:

    要真正轻松地证明这一点,您可以使用记事本,但需要使用.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

    ,它与您的观点非常相切(这是一个好问题),但在处理文件时请使用
    。传播良好的做法
    'word1:word2'
    存储到名为
    'word2'
    的备用NTFS流。使用
    dir/R word1
    在c:drive上的当前工作目录中创建名为
    'file'
    的文件。
    可能是文件名中的无效字符,但不是文件路径中的无效字符,传递给
    open
    的是路径。就像
    /
    在名称中是无效的,但是执行
    open(“/path/to/file”)
    也是非常正常的。您也可以使用Python在隐藏流中读取:
    使用open('word1.txt:word2.txt')作为f:print f.read()