2

ファイルを5つに分割したいのですが、1行目がpart1に、2行目がpart2に格納されます

こんな感じです

#1 #6  ... to part1
#2 #7  ... to part2
#3 #8  ... to part3
#4 #9  ... to part4
#5 #10 ... to part5

file1 から file5 まで 5 つのファイル ハンドルを作成する必要が(part+i)あるのですが、ファイル ハンドルとして使用できないようです。どのタイプに変換すればよいかわかりません。ストリング?

これを解決するには?ありがとう

ここに私のコードがあります

sys.argv[1] is source file  
sys.argv[2] is the directory to store  
sys.argv[3] is the number of subfile

import os
import sys

for i in range(1,sys.argv[3]+1):
    (part+i) = open(os.path.join(sys.argv[2],"part"+i),"w")

source = open(sys.argv[1],"r")
for idx,line in enumerate(source.readlines(),1):
    position = idx % int(sys.argv[3])
    if position == 0:
        (part+sys.argv[3]).write(line)
    else:
        (part+idx).write(line)

for i in range(1,sys.argv[3]+1):
    (part+i).close()
source.close()
4

2 に答える 2

4

あなたの問題は、ファイルハンドルとは関係なく、変数を動的に作成しようとするすべてのものです。

それに対する答えは次のとおりです。それをしないでください。変数名にデータを含めないでください

代わりに辞書またはリストを使用してください。次のリスト内包表記は、開いているファイル オブジェクトのリストを作成します。

files = [open(os.path.join(sys.argv[2], "part{}".format(i + 1)), "w")
         for i in range(sys.argv[3])]

これで に対処できfiles[0]files[1]さらに良いことに、このリストをループして、開いているすべてのファイル オブジェクトfiles[-1]にアクセスすると、最後のファイル オブジェクトなどに簡単にアクセスできます。

0 から始まるインデックスを使用できるようになったため、ループも非常にシンプルになりました。

for idx, line in enumerate(source.readlines()):
    position = idx % int(sys.argv[3])
    files[position].write(line)
于 2013-10-14T09:46:12.363 に答える
2

リストを使用します。

files = []
 ...
files.append(open(...))
 ...
files.append(open(...))
 ...
于 2013-10-14T09:46:33.093 に答える