我使用Python 2.5,试图创建一个名为total的变量,并向其中添加三个文件。然后我压缩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的字符串列表。但消息列表中每个字符串的最大长度不应超过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)]);
我应该有一个更简单的方法,因为这不是"蟒蛇",而且我对蟒蛇还很陌生。T有很多
我个人最喜欢的是列表理解:
msglist = [ hextotal[i:i+4096] for i in range(0,len(hextotal),4096) ]
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)]
您可以定义一个返回块的生成器:
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))
几个想法:
- 不需要在末尾使用分号
- 无需构建生成器或计算向上取整的块数
- 避免使用+=来构建长字符串
相反,让切片和列表理解为您完成工作:
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)]