2014-02-12 5 views
0

Как их распаковать отдельно? Я хочу вернуть длину строк (используемых) и самих строк из txt? Любая помощь?python- как распаковать текст или набор строк

dataType = struct.pack('H', gvrDatatype) 
varName = struct.pack('B' + str(len(gvrVarname)) + 's', len(gvrVarname), gvrVarname) 
txt = struct.pack('B' + str(len(gvrTxt)) + 's', len(gvrTxt), gvrTxt) 
+0

Если переменные будут назначены StringVar(), вы можете просто использовать переменную.get(), а затем разделить содержимое на список, split() и взять len каждого списка. Вот хороший документ на StringVar() http://effbot.org/tkinterbook/variable.htm – user1749431

ответ

1

Я думаю, что первый вопрос, на который нужно ответить: почему вы так упаковываете строки? Если вы не передаете это как структуру данных в библиотеку, которая принимает формат, который вы создали выше, вам не нужно это делать: хранить строки как текст в текстовых файлах - не как двоичные. Если это так, вам нужно пространство/производительность, используйте SQL-механизм - SQLITE будет работать нормально.

попытка также тот факт, приведенный выше код трудно читать Python - это может быть единственный способ интерполяции строк и чисел в JavaScript, но в Python, вы должны использовать: txt = struct.pack('B%ds' % len(gvrTxt) , len(gvrTxt), gvrTxt) вместо

txt = struct.pack('B' + str(len(gvrTxt)) + 's', len(gvrTxt), gvrTxt)

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

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

length = struct.unpack("B", text[0:1])[0] 
gvrTxt = struct.unpack("%ds" % length, text[1:][0] 

Но, конечно, вы не можете использовать STRUCT вообще, если вы используете только байтовые строки:

gvrTxt = text[1:] 

Если вы конкатенацию вышеуказанные структур вместе, делать что-то вроде:

data = dataType + varName + txt 

вы должны распаковать затем отдельно, используя длину varName знать, где взять начало txt

datatype = struct.unpack("H", data[0:2]) 
lenvarname = ord (data[2]) 
varName = data[3: 3 + lenvarname] 
txt = data [ 4+ lenvarname:] 

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

Также обратите внимание, что эти методы не позволяют правильно обрабатывать «текст», поскольку нет никакой гарантии, что любой текстовый контент будет содержать один байт на символ: пожалуйста, прочитайте http://www.joelonsoftware.com/articles/Unicode.html перед кодированием, даже если вы думаете вы никогда не найдете персонажа юникода в своей жизни. Потому что ты будешь. И ваша программа поразит их в первую очередь.

+0

прежде всего за вашу помощь. Да, я посылаю ... data = dataType + varName + txt в другое приложение, которое потребляет его в виде байтов. Я мог бы распаковать тип данных и varname, используя – vinu

 Смежные вопросы

  • Нет связанных вопросов^_^