尝试:
import os, shutil
wd = os.path.abspath(os.path.curdir)
newfile = os.path.join(wd, 'testfile')
print str(newfile)
with open(newfile, 'w') as f: f.write('Hello bugs')
shutil.move(newfile, os.path.join(wd, 'testfile:.txt')) # note the :
现在检查目录-新文件被删除并且没有创建其他文件-进程结束,退出代码为0。在
如果您发出:
^{pr2}$它吹出:
Traceback (most recent call last):
File "C:/Users/MrD/.PyCharm40/config/scratches/scratch_3", line 9, in <module>
shutil.move(newfile, os.path.join(wd, 'testfile:'))
File "C:\_\Python27\lib\shutil.py", line 302, in move
copy2(src, real_dst)
File "C:\_\Python27\lib\shutil.py", line 130, in copy2
copyfile(src, dst)
File "C:\_\Python27\lib\shutil.py", line 83, in copyfile
with open(dst, 'wb') as fdst:
IOError: [Errno 22] invalid mode ('wb') or filename: 'C:\\Users\\MrD\\.PyCharm40\\config\\scratches\\testfile:'
它应该如此。在
是虫子吗?在
上下文:我在测试我的代码的行为时给出了非法的文件名(:
在windows文件名中是非法的)当我惊讶于我的程序删除了原始文件(坏!)并创建了一个具有原始文件属性的零大小文件(在我的例子中文件是创建的,只是空的)和文件名,文件名给了:
-soo一个像textfile:.jpg
的文件名给了我一个零字节textfile
。这需要大量的调试-这是Python27\lib中的一个小家伙\舒蒂尔.pycopyfile()
(在上面吹而没有吹的线):
我不知道为什么在我的例子中,文件是在运行脚本时创建的
这不是Python的
shutil
或os
模块中的bug,它只是Windows中的一个奇怪之处。peterwood的link在评论中讨论了“高级数据流”一种Windows文件系统机制,它将包含元数据的隐藏文件附加到常规的可见文件中。关键字是一个附加的关键字;如果所附加的文件被删除,则删除隐藏的文件。在似乎用冒号分隔常规文件和隐藏文件的路径。例如,如果在命令行中写入:
然后关闭记事本,然后写入
^{pr2}$记事本将打开隐藏的文件。继续写一些东西,保存,然后关闭。输入}。但如果你写信
> dir
命令行将只显示foo.txt
,而不是{您刚刚编辑的文件将出现,您的更改将保持不变。在
那么你的Python代码发生了什么呢?{a2的文档中说:
因此,当您将
testfile
移动到testfile:.txt
时,Python首先将testfile
复制到隐藏的testfile:.txt
。但随后它会移除隐藏的。因此,在您看来,原始文件已被删除,而没有创建新文件。在下面的代码片段可能会使这一点更清楚(我将其保存为
demo.py
,并且我在同一个,其他明智的空目录中运行它):打印:
这表明我们可以创建一个普通文件,对其进行写入,然后将该普通文件复制到其隐藏流中,打开并读取它,结果如预期的那样。然后我们看到}都存在,即使{}只显示{}。然后我们删除}也不再存在。在
os.path.exists
表示test
和它的隐藏附件{test
,我们发现{最后,不能创建没有名称的隐藏数据流,因此
test:
是无效路径。在这种情况下,Python正确地抛出了一个异常。在因此,Python代码实际上在Windows下正常工作,“替代数据流”只是一个鲜为人知的“特性”,这种行为令人惊讶。在
相关问题 更多 >
编程相关推荐