#python #input #plist
#python #ввод #список
Вопрос:
моему Python plist parser не нравится моя длинная строка в формате plist.
plist_data = plistlib.readPlist(plistString)
plistString на самом деле является содержимым файла, который я открыл. Как ни странно, ввод входного файла в функцию readPlist работает, но мне пришлось выполнить некоторое дальнейшее форматирование этого файла в python.
Я запускаю приведенный выше код и получаю IOError: [Errno 63]
на консоли. Не уверен, как этого избежать? Я предполагаю, что функция ищет «необработанный» ввод вместо строки. Как мне это обмануть?
Ответ №1:
Если вы хотите прочитать строку как файл, используйте StringIO.
fakeFile= StringIO.StringOI( plistString )
plist_data = plistlib.readPlist(fakeFile)
Файл pList лучше не открывать и не читать. plistlib.readPlist
открывает и читает за вас.
Комментарии:
1. вау, в итоге я нашел самое запутанное решение. Я создал временный файл, сохранил в нем свою строку. открыл этот временный файл и прочитал его в plistlib
2. @RD. Вау, это плохо. Также. Вам вообще не следовало читать строку pListString. Просто укажите имя файла в
plistlib.readPlist()
.3. Причина, по которой я это сделал, заключается в том, что readPlist проигнорировал (удалил) некоторые символы в строке, которые мне нужно было использовать. Я прочитал строку, преобразовал игнорируемые специальные символы в символы escape и прочитал их обратно.
Ответ №2:
plistlib.readPlist
принимает файл или его имя, а не содержимое. Неудивительно, что вы получаете эту ошибку:
#define ENAMETOOLONG 63 /* File name too long */
Попробуйте plistlib.readPlistFromBytes(data)
или используйте StringIO, чтобы представить вашу строку в виде файла
Комментарии:
1. вау, в итоге я нашел самое запутанное решение. Я создал временный файл, сохранил в нем свою строку. открыл этот временный файл и прочитал его в plistlib
2.
plist_data = plistlib.readPlistFromBytes(plistReader) AttributeError: 'module' object has no attribute 'readPlistFromBytes'
3. похоже, readPlistFromBytes предназначен только для python3. Если вы все еще используете 2.x, то StringIO — это способ