Ошибка синтаксического анализатора Python plist: [Ошибка 63] слишком длинное имя файла:

#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 — это способ