13

大きな xml ファイルを小さなチャンクに分割しようとしています。出力ファイルに書き込み、そのサイズをチェックしてしきい値を超えたかどうかを確認しましたが、getsize() メソッドが期待どおりに機能しているとは思いません。

サイズが変化しているファイルのファイルサイズを取得するにはどうすればよいでしょうか。

私はこのようなことをしました...

import string
import os

f1 = open('VSERVICE.xml', 'r')
f2 = open('split.xml', 'w')

for line in f1:
  if str(line) == '</Service>\n':
    break
  else:
    f2.write(line)
    size = os.path.getsize('split.xml')
    print('size = ' + str(size))

これを実行すると、約80回の繰り返しのファイルサイズとして0が出力され、次に4176が出力されます.Pythonは出力を実際に出力する前にバッファに保存しますか?

4

5 に答える 5

11

ファイルサイズとファイル位置が異なります。例えば、

os.path.getsize('sample.txt') 

ファイルサイズを正確にバイト単位で返します。

しかし

f = open('sample.txt')
print f.readline()
f.tell() 

ここで f.tell() は、ファイル ハンドラの現在の位置を返します。つまり、次の書き込みでデータが置かれる場所です。バッファリングを認識しているため、出力ファイルに単純に追加する限り、正確である必要があります。

于 2011-04-28T16:22:11.137 に答える
10

はい、Python は出力をバッファリングしています。次のように、自分でサイズを追跡することをお勧めします。

size = 0
for line in f1:
  if str(line) == '</Service>\n':
    break
  else:
    f2.write(line)
    size += len(line)
    print('size = ' + str(size))

(これは 100% 正確ではない可能性があります。たとえば、Windows では、\r\n行区切りのために各行が 1 バイト増加しますが、単純なチャンクには十分なはずです。)

于 2009-06-18T16:41:16.620 に答える
5

次のように、os.path.getsize を os.tell に置き換えてみましたか?

f2.write(line)
size = f2.tell()
于 2009-08-06T14:26:27.930 に答える
4

サイズを自分で追跡することは、あなたの場合には問題ありません。別の方法は、サイズを確認する直前にファイル バッファーをフラッシュすることです。

f2.write(line)
f2.flush()  # <-- buffers are written to disk
size = os.path.getsize('split.xml')

もちろん、あまりにも頻繁に行うと、ファイル I/O が遅くなります。

于 2009-06-18T19:16:56.100 に答える
1

ファイルの終わりまでのオフセットを見つけるには:

file.seek(0,2)
print file.tell()

実際の例-ファイルの更新を読み取り、発生したときにそれらを印刷します。

file = open('log.txt', 'r')
#find inital End Of File offset
file.seek(0,2)
eof = file.tell()
while True:
    #set the file size agian
    file.seek(0,2)
    neweof = file.tell()
    #if the file is larger...
    if neweof > eof:
        #go back to last position...
        file.seek(eof)
        # print from last postion to current one
        print file.read(neweof-eof),
        eof = neweof
于 2011-11-25T11:58:43.183 に答える