2016-12-06 8 views
1

私はPythonには初めてですが、私はこの問題に対して明確な答えを見なければなりません。大きなテキストファイルを1MB未満(1〜2バイト文字の場合は500000文字)の小塊に分割する必要がありますが、これをやりなおすことなく最も近い改行で分割する必要があります。ファイルサイズを決定するための明確な方法はありませんので、文字制限が(完璧ではないが、ほとんどの文字は1バイト、この安全であるという仮定に基づいて)に達した前に、私はラインを見つけることpython - ファイルを最大行数で複数のtxtファイルに分割し、文字数に基づいて最大ファイルサイズを超えないようにする

chars = words = lines = 0 


with open('rawfile.txt', 'r') as in_file: 

     for line in in_file: 
      while chars < 500000: 
       lines += 1 
       words += len(line.split()) 
       chars += len(line) 
     #print lines, words, chars 
     linebreak = lines -1 
     print linebreak 
     chars = words = lines = 0 
を次のアプローチを取りました

これは、文字数が500000文字の制限を超える前の行を返します。

私は、次の操作を行うのに苦労しています:ラインlinebreak

から再び新しいファイル
スタート機能にend_lineに任意の提案をstart_line保存linebreak

が0からstart_lineを設定し、end_lineを?より良い方法にもオープン。

答えて

0

このようにしないでください。代わりに、あなたが最初にそれらを読んでいる間に線を書いてください。制限を超えようとしている行をヒットすると、現在のファイルを閉じて、新しいファイルを開始します。

chars = words = lines = fnum = 0 
limit = 500000 

in_file = open('newfile_' + str(fnum) + '.txt', 'r') 
with open('rawfile.txt', 'r') as in_file: 

    for line in in_file: 
     lines += 1 
     words += len(line.split()) 
     if chars + len(line) > limit: 
      # close in_file and open the next one 
      in_file.close() 
      fnum += 1 
      chars = words = lines = fnum = 0 
      in_file = open('newfile_' + str(fnum) + '.txt', 'r') 

     in_file.write(line) 
     chars = chars + len(line) 
+0

ありがとうございました!しかし、私はこれをボックスの外で動作させることができませんでした。 newfileに読み込み権限しかないので、書き込み権限を与えるためにw/w +に更新しました。また、両方のファイルはin_fileを使用しているので、outfileとしてopen(newfile、 'w')を使用し、infileとしてopen(oldfile、 'r'、encoding = 'utf-8')というコードを実装しています。これ以上のことでプレイしますが、私を正しい軌道に乗せてくれてありがとう! – mcraniseq

+0

これは機能しました!上記のスクリプトを追加しましたが、コードは1つのファイルしか作成しませんでした。コードを読み返した後、私はfmunが0に戻ってきたことに気付きました。それが削除されると、それは魅力のように働きました、ありがとう! '#updated first lin to: out_fileとしてopen( 'newfile_' + str(fnum)+ '.txt'、 'w +')をopen( 'rawfile.txt'、 'r')として開きます。 #fnumを0にリセットして削除しました: chars = words = lines = 0 – mcraniseq

+0

すみません!はい、リセットされたfnumは私の "ボランティア"の日の最後に私のパートコピーペーストで間違いです。これはうまくいった。 – Prune

0

これは何か?

# open file for reading 
anin = open('temp.txt') 

# set the char limit 
charlimit = 100 

# index of line being processed 
anindex = 0 

# output text buffer 
anout = '' 

# index of file to output 
acount = 1 

def wrapFile(): 
    global anout 

    if anout == '': return 

    achunk = 'chunk.' + str(acount) + '.txt' 
    achunk = open(achunk, 'w') 
    achunk.write(anout) 
    achunk.close() 
    acount += 1 
    anout = '' 

while True: 
    anindex += 1 
    aline = anin.readline() 

    # EOF case 
    if aline == '': 
     wrapFile() 
     anin.close() 
     break 

    # next line within limit case 
    if len(anout + aline) <= charlimit: 
     anout += aline 
     continue 

    # next line out of limit cases 
    if len(anout) > 0: 
     wrapFile() 

    anout = aline 

    # new line is below char limit itself 
    if len(anout) < charlimit: 
     continue 

    # new line exceeds char limit 
    print 'Line', anindex, 'alone exceeds the given char limit!' 
    wrapFile() 
関連する問題