2012-08-13 8 views
8

Próbuję użyć mkstemp z Python 3:Jak uzyskać obiekt pliku z mkstemp()?

Python 3.2.3 (default, Jun 25 2012, 23:10:56) 
[GCC 4.7.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from tempfile import mkstemp 
>>> mkstemp() 
(3, '/tmp/tmp080316') 

Według documentation pierwszy element krotki ma być uchwyt pliku. W rzeczywistości jest to int. Jak uzyskać właściwy obiekt pliku?

Odpowiedz

9

W dokumentacji mktemp można zobaczyć przykład jak używać NamedTemporaryFile jak chcesz: http://docs.python.org/dev/library/tempfile.html?highlight=mkstemp#tempfile.mktemp

>>> f = NamedTemporaryFile(delete=False) 
>>> f 
<open file '<fdopen>', mode 'w+b' at 0x384698> 

Zapewnia to takie samo zachowanie jak mkstemp, ale zwraca obiekt pliku.

+1

To świetnie. Chciałem użyć 'mkstemp', ponieważ plik będzie zawierał poufne informacje i pomija, że ​​NamedTemporaryFile faktycznie go używa. – Erik

0

Symbol int reprezentuje uchwyt pliku na poziomie OS OS-level. To, czego potrzebuję, to obiekt plików na wyższym poziomie. Aby jeden, użyj:

os_handle = mkstemp() 
f = open(mkstemp()[0]) 
+4

Nie znaczy 'os .fdopen'? –

+0

'os.fdopen' robi dokładnie to samo, co' otwarte', z tym wyjątkiem, że akceptuje tylko uchwyty plików, bez ścieżek plików. – Erik

+5

Nie sądzę, że to prawda: 'open (0)' daje mi * TypeError: zmuszając do Unicode: potrzebujesz łańcucha lub bufora, int found *, czego się spodziewałem. Przynajmniej myślę, że liczenie na otwartą akceptację int nie będzie zbyt przenośne. ** Aktualizacja: ** działa na Pythonie3, ale nie na Python2 (jeśli ci na tym zależy.) – poolie

2

Najlepszym sposobem, jaki znam, jest używanie tempfile.NamedTemporaryFile, jak widać w odpowiedzi @tordek.

Ale jeśli masz surowego FD z podstawowej OS, można to zrobić, aby uczynić go obiektu pliku:

f = open(fd, closefd=True) 

Działa to w Pythonie 3

Powiązane problemy