2013-09-19 2 views
5

Я новичок в программировании python2.6, моя цель - создать .txt или .xls «временный файл» в каталоге temp os и записать на него некоторые данные. Затем после этого прочитайте данные из «временного файла» после завершения данных чтения, удалите временный файл из каталога temp.Как я могу прочитать NamedTemporaryFile в python.?

для этого процесса я выбираю NamedTemporaryFile(), но не может быть достигнут. Не могли бы вы предложить, как я могу его достичь. Спасибо заранее.

>>> import os 
>>> import tempfile 
>>> with tempfile.NamedTemporaryFile() as temp: 
      print temp.name 
      temp.write('Some data')    
      f = open(os.path.join(tempfile.gettempdir(),temp.name)) 
      lines = f.readlines() 
      f.close() 
      temp.flush() 


c:\users\110\appdata\local\temp\tmpf8p3kc 

Traceback (most recent call last): 
    File "<pyshell#3>", line 4, in <module> 
    f = open(os.path.join(tempfile.gettempdir(),temp.name)) 
IOError: [Errno 13] Permission denied: 'c:\\users\\110\\appdata\\local\\temp\\tmpf8p3kc' 

ответ

1

У меня была эта проблема раз ..

Из документации: «Является ли имя может быть использовано для открытия файла во второй раз, в то время как временный файл с именем остается открытым, варьируется в зависимости от платформ (его можно использовать в Unix, он не может работать в Windows NT или более поздней версии) ».

Почему бы вам просто не попробовать прочитать файл, используя объект temp, когда он еще открыт? Если он открыт с w+b, то вы должны иметь возможность искать() и читать()

+3

В общем, не всегда возможно «просто попытаться прочитать из файла». В случае, когда я столкнулся с этой проблемой, я писал временный файл, который позже был загружен в другую программу, и что другая программа (по которой у меня нет контроля), как ожидается, сможет открыть указанный файл. – jamesdlin

-1

Я создал альтернативный механизм, который создает именованный временный файл, но не сохраняет его открытым. Таким образом, он полностью доступен в любом месте. Вместо удаления при закрытии он удаляет в конце блока with.

Установить пакет shelljob. Пример использования с docs:

with fs.NamedTempFile() as nm: 
    proc.call("curl http://mortoray.com/ -o {}".format(nm)) 
    html = open(nm).read() 
    print(len(html)) 
8

подход я использовал, чтобы использовать file = tempfile.NamedTemporaryFile(..., delete=False), чтобы закрыть полученный файл после того, как я закончу писать к нему, и вручную вызвать os.remove(file.name), когда я сделал. (Вы можете сделать удаление файла в методе __exit__ из a custom context manager, чтобы это было удобно использовать с with.)

Смежные вопросы