Ответ 1
Комментарий: он прочный и совместимый со спецификацией?
Пока ваши данные следуют этим предварительным условиям:
- Строка Первая - это граница
- Следующий заголовок завершается пустой Линией
- Каждая часть сообщения заканчивается символом
Комментарий. Что, если содержимое двоично, как поток JPEG?
Это похоже на разрыв, поскольку есть String Используемые методы и чтение содержимого использует .readline()
, который зависит от Новая строка.
Поэтому для decode
из BASE64, а затем unpack
Multipart - это неправильный подход!
Комментарий: если версия, использующая общую библиотеку
Если вы можете предоставить свои данные как стандартные MIME Сообщение, вы можете использовать следующее:
import email
msg = email.message_from_string(mimeHeader+data)
print('is_multipart:{}'.format(msg.is_multipart()))
for part in msg.walk():
if part.get_content_maintype() == 'multipart':
continue
filename = part.get_filename()
payload = part.get_payload(decode=True)
print('{} filename:{}\n{}'.format(part.get_content_type(), filename, payload))
Выход:
is_multipart:True application/rtf filename:file1.rtf b'{\rtf1\x07nsi\x07nsicpg1252\\cocoartf1504\\cocoasubrtf830\n{\x0conttbl\x0c0\x0cswiss\x0ccharset0'... (omitted for brevity) application/rtf filename:file2.rtf b'{\rtf1\x07nsi\x07nsicpg1252\\cocoartf1504\\cocoasubrtf830\n{\x0conttbl\x0c0\x0cswiss\x0ccharset0'... (omitted for brevity)
Вопрос: проанализируйте строку с несколькими данными
Pure Python Solution, например:
import re, io
with io.StringIO(data) as fh:
parts = []
part_line = []
part_fname = None
new_part = None
robj = re.compile('.+filename=\"(.+)\"')
while True:
line = fh.readline()
if not line: break
if not new_part:
new_part = line[:-1]
if line.startswith(new_part):
if part_line:
parts.append({'filename':part_fname, 'content':''.join(part_line)})
part_line = []
while line and line != '\n':
_match = robj.match(line)
if _match: part_fname = _match.groups()[0]
line = fh.readline()
else:
part_line.append(line)
for part in parts:
print(part)
Выход
{'filename': 'file1.rtf', 'content': '{\rtf1\x07nsi\x07nsicpg1252\\cocoartf1504\\cocoasubrtf830\n... (omitted for brevity) {'filename': 'file2.rtf', 'content': '{\rtf1\x07nsi\x07nsicpg1252\\cocoartf1504\\cocoasubrtf830\n... (omitted for brevity)
Протестировано с помощью Python: 3.4.2