2013-06-02 9 views
0

Я не могу прочитать из временного файла, созданного QTemporaryFile, может быть, вы можете проверить код, приведенный ниже ...PyQt: QTemporaryFile - не удалось прочитать из файла

>>> 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... 

будут благодарны за любую помощь!

EDIT

я расширил QTemporaryFile вести себя, как и ожидалось, но все еще ищет более чистым раствором ...

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 

ответ

0

Если вы хотите, чтобы заставить операционную систему, чтобы написать данные в файл вы должны всегда 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 

Возможно вызов size() неявно НЦВО чтобы ОС скрылась, следовательно, поведение, которое вы наблюдали.

+0

Спасибо, поэтому теперь я знаю, как правильно писать временный файл ... но как я могу его прочитать? tempFile.read (1000) возвращает пустую строку, tempFile.readAll() возвращает пустой QByteArray. Конечно, я всегда могу открыть open (fileTemp.fileName(), 'r'), но почему эти два упомянутых не работают? – user2220568

+0

@ user2220568 Вы должны думать, что каждый файл имеет указатель на текущую позицию файла. Когда вы создаете новый временный файл и записываете ''foobar'', указатель будет перемещен в конце данных, записанных в файл. 'read()' считывает данные из текущей позиции вперед, следовательно, пустую строку (потому что после ''foobar'' ваш файл пуст). Если вы хотите установить текущую позицию, вы можете использовать метод 'seek'. В частности, 'tempFile.seek (0)' будет устанавливать текущую позицию в начале файла. – Bakuriu

+0

Спасибо! но все еще чего-то не хватает. после f.flush() и f.seek (0), f.readAll() возвращает пустой QByteArray. Но f.flush() f.seek (1) f.seek (0) выполнил задание ... – user2220568

0

поэтому правильный способ сделать это, наконец:

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

, но он работает только на Linux ... на окнах я должен был сделать что-то вроде этого:

>>> ================================ 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') 

возможно сделать это более ясно:

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() 
Смежные вопросы