Python tempfile:坏了还是我做错了?

时间:2011-10-13 16:58:22

标签: python temporary-files

对于一个小的python脚本,我想使用临时文件和tempfile模块。不知怎的,它没有给出预期的行为,我不知道我做错了什么或者这是一个错误:

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tempfile
>>> tmp = tempfile.TemporaryFile()
>>> tmp.read()
''
>>> tmp.write('test')
>>> tmp.read()
'P\xf6D\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ [ommitted]'

或者我只尝试了文本模式,但行为仍然很奇怪:

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tempfile
>>> tmp = tempfile.TemporaryFile('w+t')
>>> tmp.read()
''
>>> tmp.write('test')
>>> tmp.read()
'\x00\xa5\x8b\x02int or long, hash(a) is used instead.\n    i\x10 [ommitted]'
>>> tmp.seek(0)
>>> tmp.readline()
'test\x00\xa5\x8b\x02int or long, hash(a) is used instead.\n'

感谢任何帮助!


其他信息:在Windows 7 Enterprise x64计算机上运行的当前Python XY发行版中的Python 2.7.2(32位)。在测试运行中,python在D:\ temp \ myusername下的临时目录中创建了临时文件名“tmpvyocxj”,其中运行了其他几个python进程。键入的命令,我没有尝试在脚本中重现它。行为没有改变,没有其他python进程在运行。


更新: 此行为不仅限于tempfile模块,还适用于普通的file.read()和file.write()操作。根据CPython的说法,这两个函数只调用底层的libc fread()例程。在C标准中,写入之后没有搜索或刷新的读取的确切行为是未定义的,即每次实现都会导致不同的结果。

2 个答案:

答案 0 :(得分:8)

我刚刚在Windows XP上的Python 2.7.1中重现了这种行为。

那是:

>>> tmp.write('test')
>>> tmp.seek(0)
>>> tmp.read()
'test'

VS

>>> tmp.write('test')
>>> tmp.read()
'x\x01\x98\x00pfile.pyR\x05\x00\x00\x00G\x01\x00\x00s\x12 [blah blah blah]'
>>> tmp.seek(0)
>>> tmp.read()
'testx\x01\x98\x00pfile.pyR\x05\x00\x00\x00G\x01\x00\x00s\x12 [blah blah blah]'

修改

对于踢球,我也检查过:

  1. Windows 7,同样是2.7.1(与我的XP安装版本相同),并且在XP上看到了相同的行为。
  2. Cygwin版本2.6.5,此错误存在。

答案 1 :(得分:0)

无法在Ubuntu上重现,使用python 2.7.1

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tempfile
>>> tmp = tempfile.TemporaryFile('w+t')
>>> tmp.read()
''
>>> tmp.write('test')
>>> tmp.read()
''
>>> tmp.seek(0)
>>> tmp.readline()
'test'
>>>