2011-06-25 10 views
4

私はPython 2.5を使用しており、totalという変数を作成して3つのファイルを追加しようとしています。次に、私は合計を圧縮して16進数に変換し、最大長4096文字の文字列リストに分割します。私は効率的にそれをやった感じPython:1つの変数に3つのテキストファイルを追加してリストに分割する方法

は現在、私は、ファイルのリストを持っていると私はそれがすべてこのように、ここ件まで

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'); 

を合計して連結しています。しかし、その後、私はmsgtlistという文字列のリストに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)]); 

これは "pythonic"ではないし、Pythonにはかなり新しいので、より単純な方法が必要です。 THanks a lot

答えて

3

私の個人的なお気に入りは、リスト内包である:

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

はどうもありがとうございました:) – kal

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

はどうもありがとうございました:) – kal

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)) 
+0

は非常にすべてのあなたのありがとう:) – kal

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)] 
関連する問題