Python:如何将三个文本文件添加到一个变量中,然后将其拆分为列表?

4
我正在使用Python 2.5版本,尝试创建一个名为total的变量,并将三个文件添加到其中。然后我会压缩total并将其转换为十六进制,并将其拆分成一个字符串列表,每个字符串最大长度为4096个字符。
目前,我有一个文件列表,并按如下方式将其全部连接到total中。
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

我个人最喜欢的是列表推导式:

msglist = [ hextotal[i:i+4096] for i in range(0,len(hextotal),4096) ]

2
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
你可以定义一个生成器,返回块:
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))

1
一些想法:
  • 不需要在行末使用分号
  • 不需要构建生成器或计算块的向上舍入数字
  • 避免使用+=来构建长字符串

相反,让切片和列表推导式为您完成工作:

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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接