Python: как добавить три текстовых файла в одну переменную, а затем разбить их на список - PullRequest
4 голосов
/ 26 июня 2011

Я использую Python 2.5 и пытаюсь создать переменную с именем total и добавить в нее три файла.Затем я сжимаю итоговое значение, преобразую его в шестнадцатеричный формат и делю на список строк с максимальной длиной 4096 символов.

В настоящее время у меня есть список файлов, и я объединяю все это в итоговое значение таким образом.

filelist = ['debug.log', 'error.log', 'reclog.log'];
total = ''
for files in filelist:
    f = open(files, 'r');
    total = total + f.read();
    f.close();
compressedtotal = zlib.compress(total);
hextotal = compressedtotal.encode('hex');

Здесь я чувствую, что сделал это эффективно.Но затем я пытаюсь разделить hextotal на список строк с именем msglist.Но максимальная длина каждой строки в msglist должна быть не более 4096 символов.

if len(hextotal)%4096 >0 : checker = 1;
else: checker = 0;
nmsgs = int(math.ceil(len(hextotal)/4096));
nn = str(nmsgs);
msglist = [];
for msgs in range(1,nmsgs+1):
    if msgs == nmsgs and checker == 1:
        msglist.append(hextotal[4096*(msgs-1):]);
    else: msglist.append(hextotal[4096*(msgs-1):4096*(msgs)]);

Должен быть более простой способ, потому что это не "pythonic" и я довольно плохо знаком с python.Большое спасибо

Ответы [ 4 ]

3 голосов
/ 26 июня 2011

Мой личный фаворит - это понимание списка:

msglist = [ hextotal[i:i+4096] for i in range(0,len(hextotal),4096) ]
2 голосов
/ 26 июня 2011
msglist = []
for start in range(0, len(hextotal), 4096):
    msglist.append(hextotal[start:start+4096])

Вы можете нарезать что-то за конец; он просто автоматически выдаст вам только конец строки (например, нарезка "abcd"[2:6] даст вам cd).

Как указал CSkau, это также можно сделать в форме понимания списка:

msglist = [hextotal[i:i+4096] for i in range(0, len(hextotal), 4096)]
1 голос
/ 18 октября 2011

Несколько мыслей:

  • Нет необходимости использовать точки с запятой в конце строки
  • Нет необходимости строить генератор или вычислять округленные вверх куски
  • Избегайте использования + = для создания длинных строк

Вместо этого пусть срезы и составления списков сделают работу за вас:

filelist = ['debug.log', 'error.log', 'reclog.log'];
total = [open(filename, 'r').read() for filename in filelist]
compressedtotal = zlib.compress(''.join(total))
hextotal = compressedtotal.encode('hex')
msglist = [hextotal[i:i+4096] for i in range(0, len(hextotal), 4096)]
1 голос
/ 26 июня 2011

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

def chunkify(l, n):
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

Тогда вы можете либо перебрать куски

msglist = []
for chunk in chunkify(hextotal, 4096):
    msglist.append(chunk)

или создайте окончательный список примерно так

msglist = list(chunkify(hextotal, 4096))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...