Как я могу получить доступ к загруженному файлу в универсальном режиме новой строки?

Я работаю с файлом, загруженным с помощью Django forms.FileField. Это возвращает объект типа InMemoryUploadedFile.

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

Спасибо


person Zach    schedule 09.12.2009    source источник


Ответы (1)


Если вы используете Python 2.6 или выше, вы можете использовать класс io.StringIO после считывания файла в память (используя метод read()). Пример:

>>> import io
>>> s = u"a\r\nb\nc\rd"
>>> sio = io.StringIO(s, newline=None)
>>> sio.readlines()
[u'a\n', u'b\n', u'c\n', u'd']

Чтобы использовать это в представлении django, вам может потребоваться преобразовать данные входного файла в unicode:

stream = io.StringIO(unicode(request.FILES['foo'].read()), newline=None)
person Antoine P.    schedule 30.12.2009
comment
Это прекрасно работает. Я использую его вместе с csv.DictReader в своем представлении django. reader = csv.DictReader(stream) затем for row in reader: #import each row Любые мысли о том, что это будет делать с использованием памяти? У меня «бюджет» :) Я знаю, что мне, вероятно, следует просто сохранить файл во временном месте, но мне любопытно, нужно ли мне на данный момент выполнить какую-либо очистку от мусора? - person teewuane; 30.12.2014
comment
Это работает до тех пор, пока исходный файл может быть закодирован как utf-8, для файла, отличного от utf-8, возникает ошибка :( - person Trinh Hoang Nhu; 31.07.2019