Python tempfile: сломан или я делаю это неправильно? - PullRequest
4 голосов
/ 13 октября 2011

Для небольшого скрипта на 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'

Любая помощь приветствуется!


Дополнительная информация: Python 2.7.2 (32-разрядный) из текущего дистрибутива Python XY, работающий на компьютере под управлением Windows 7 Enterprise x64. В ходе пробного запуска python создал временное имя файла "tmpvyocxj" в моем временном каталоге в папке D: \ temp \ myusername, где запущено несколько других процессов python. Команды, которые были введены, я не пытался воспроизвести в сценарии. Поведение остается неизменным, и никакие другие процессы Python не выполняются.


Обновление: Это поведение не ограничивается модулем tempfile, но также и для обычных операций file.read () и file.write (). Согласно CPython парни обе функции вызывают только базовые подпрограммы libc fread (). В стандарте C точное поведение чтения после записи без поиска или сброса между ними не определено, то есть каждая реализация может привести к разным результатам.

Ответы [ 2 ]

8 голосов
/ 13 октября 2011

Я только что воспроизвел это поведение в Python 2.7.1 для Windows XP.

Этот представляется ошибкой, которая возникает только при попытке чтения без поиска.

То есть:

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

против

>>> 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]'

EDIT:

Для ударов я тоже проверил:

  1. Windows 7, снова 2.7.1 (такая же сборка, как моя установка XP), и то же поведение было видно, как и в XP.
  2. Cygwin версии 2.6.5, и эта ошибка отсутствует .
0 голосов
/ 13 октября 2011

не может воспроизвести в 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'
>>> 
...