Question

I'm unable to read from temporary file created by QTemporaryFile, maybe you can check the code below...

>>> from PyQt4 import QtCore
>>> fileTemp = QtCore.QTemporaryFile()
>>> fileTemp.open()
True   #file is created
>>> fileTemp.fileName()
PyQt4.QtCore.QString(u'/tmp/qt_temp.TJ2302')
>>> fileTemp.writeData('foobar')
6L     #six bytes are written, great
>>> open(fileTemp.fileName(), 'r').read()
''     #but there is still nothing inside!
>>> fileTemp.size()
6L     #magically, by doing this 'foobar' appears in this tempFile...
       #the same effect gives e.g. fileTemp.readData(1000), but nothing is read
>>> open(fileTemp.fileName(), 'r').read()
'foobar'
>>> fileTemp.readData(1000)
''     #why...
>>> fileTemp.readAll()
PyQt4.QtCore.QByteArray('')
>>> fileTemp.readAll().size()
0      #why...

will be grateful for any help!

EDIT

I've extended QTemporaryFile to behave as expected, but still looking for a more clean solution...

class MyTemporaryFile(QtCore.QTemporaryFile):
    def __init__(self, *argc, **argv):
        QtCore.QTemporaryFile.__init__(self, *argc, **argv)

    def write(self, data):
        f = open(self.fileName(), 'w')
        f.write(data)
        f.close()

    def read(self):
        f = open(self.fileName(), 'r')
        data = f.read()
        f.close()
        return data
Était-ce utile?

La solution

If you want to force the OS to write the data to a file you should always flush():

In [10]: from PyQt4 import QtCore

In [11]: fileTemp = QtCore.QTemporaryFile()

In [12]: fileTemp.open()
Out[12]: True

In [13]: fileTemp.fileName()
Out[13]: PyQt4.QtCore.QString(u'/tmp/qt_temp.XM5599')

In [14]: fileTemp.writeData('foobar')
Out[14]: 6L

In [15]: with open(fileTemp.fileName(), 'r') as f:
   ....:     print(f.read())
   ....:     


In [16]: fileTemp.flush()
Out[16]: True

In [17]: with open(fileTemp.fileName(), 'r') as f:
    print(f.read())
   ....:     
foobar

Probably the call to size() implicitly forces the OS to flush, hence the behaviour you have observed.

Autres conseils

so the proper way to do this is finally:

>>> from PyQt4 import QtCore
>>> f = QtCore.QTemporaryFile()
>>> f.open()
True
>>> f.writeData('foobar')
6L
>>> f.flush()
True
>>> f.seek(0)
True
>>> f.readAll()
PyQt4.QtCore.QByteArray('foobar')

but it works only on linux... on windows I had to do something like this:

>>> ================================ RESTART ================================
>>> from PyQt4 import QtCore
>>> f = QtCore.QTemporaryFile()
>>> f.open()
True
>>> f.writeData('foobar')
6L
>>> f.flush()
True
>>> f.seek(0)
True
>>> f.readAll()
PyQt4.QtCore.QByteArray()
>>> ================================ RESTART ================================
>>> from PyQt4 import QtCore
>>> f = QtCore.QTemporaryFile()
>>> f.open()
True
>>> f.writeData('foobar')
6L
>>> f.flush()
True
>>> f.seek(1)
True
>>> f.seek(0)
True
>>> f.readAll()
PyQt4.QtCore.QByteArray('foobar')

maybe to make this more clear:

from PyQt4 import QtCore

class MyTemporaryFile(QtCore.QTemporaryFile):
    def __init__(self, *argc, **argv):
        QtCore.QTemporaryFile.__init__(self, *argc, **argv)
        self.open()

    def write(self, data):
        self.writeData(data)
        self.flush()

    def read(self):
        #self.seek(1)   #on windows it works only with this line uncommented
        self.seek(0)
        return self.readAll()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top