Как сделать виртуальную обработку файлов?

Итак, для создания файлов я использую следующее:

fileHandle = open('fileName', 'w')

затем напишите содержимое в файл, закройте файл. На следующем шаге я обрабатываю файл. В конце программы я получаю "физический файл", который мне нужно удалить.

Есть ли способ написать "виртуальный" файл, который ведет себя точно так же, как "физический" (позволяющий ему управлять таким же образом), но не существует в конце прогона в Python?

Ответ 1

Возможно, вы захотите использовать tempfile.SpooledTemporaryFile, который даст вам лучшее из обоих миров в том смысле, что он создаст временную память сначала, но автоматически переключится на физический файл на диске, если данные, хранящиеся в памяти, превысят заданный размер.

Еще одна приятная особенность заключается в том, что (при использовании памяти) она автоматически будет использовать либо io.BytesIO, либо io.StringIO в зависимости от того, что используется mode, позволяя вам читать или записывать строки Unicode или двоичные данные (байты) на него.

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

Когда вы полностью закончите работу с файлом и закроете его, он будет автоматически удален с диска, если количество данных в нем заставило его перевернуться в физический файл.

Ответ 2

У вас есть StringIO и BytesIO в модуле io.

StringIO ведет себя как файл, открытый в текстовом режиме - чтение и запись строк юникода (эквивалентно открытию файла с io.open(filename, mode, encoding='...')), а BytesIO ведет себя как файл, открытый в двоичном режиме (mode='[rw]b'), и может читать байты записи.

Python 2:

In [4]: f = io.BytesIO('test')
In [5]: type(f.read())
Out[5]: str
In [6]: f = io.StringIO(u'test')
In [7]: type(f.read())
Out[7]: unicode

Python 3:

In [2]: f = io.BytesIO(b'test')
In [3]: type(f.read())
Out[3]: builtins.bytes
In [4]: f = io.StringIO('test')
In [5]: type(f.read())
Out[5]: builtins.str

Ответ 3

Вы можете использовать StringIO в качестве виртуального файла, из официальной документация

import StringIO

output = StringIO.StringIO()
output.write('First line.\n')
print >>output, 'Second line.'

# Retrieve file contents -- this will be
# 'First line.\nSecond line.\n'
contents = output.getvalue()

# Close object and discard memory buffer --
# .getvalue() will now raise an exception.
output.close()

Ответ 4

Существует модуль StringIO, читайте его документацию, он должен быть прост в использовании.

Помните, что это сохранит содержимое "файла" в памяти. Если у вас слишком много данных, вероятно, было бы лучше создать реальный файл, например. в /tmp и затем удалите его.

Ответ 5

Если вы имеете в виду запись в память вместо файла, вы можете просто записать текст в буфер и использовать следующую функцию:

def write(text):
  global buffer
  buffer += text + '\n'  # Add a linefeed as you would if you were writing to a file

buffer = ""  # Initialize the buffer
write("My name is Steve Grafton")

В конце у вас будет буфер, который будет таким же, как если бы вы записали свой материал в файл, а затем откройте файл и прочитаете все его содержимое в буфер! Более того, вы можете использовать буфер во время процесса (до завершения записи) и выполнять поиск в нем, как если бы вы создали файл для чтения и записи, только в этом случае ваш указатель будет