2009-06-18 1 views
12

大きなxmlファイルを小さなチャンクに分割しようとしています。出力ファイルに書き込んだ後、そのサイズがしきい値を超えているかどうかを確認しますが、getsize()メソッドが期待どおりに動作しているとは思われません。ファイルに書き込んだ後、os.path.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は実際にそれを出力する前にバッファに出力を保存し実行していますか?

答えて

9

はい、Pythonが出力をバッファしています。

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

(それが原因\r\n行区切りの各行はバイトを得ることができますWindows上で例えば、100%正確であるが、それはない可能性があります。あなたは、このような何か、サイズを自分で追跡したほうが良いと思います簡単なチャンクのために十分なはずです。)

+0

感謝を!それはうまくいくはずです。 100%正確である必要はありません。 – Maulin

3

自分のサイズを追跡することは、あなたのケースでは問題ありません。

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

あまりにも多くの場合、I/O、当然のファイルが遅くなりますことを行う:あなたのサイズをチェックする直前に別の方法は、ファイルのバッファをフラッシュすることです。

5

は、あなたがこのように、os.tellでos.path.getsizeを交換しようとしたことがあり:

f2.write(line) 
size = f2.tell() 
11

をファイルサイズは、ファイルの位置は異なっています。たとえば、

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

正確にはファイルサイズをバイト単位で返します。次の書き込みはそのデータを置く、すなわち -

しかしf.tellここ

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

()はファイルハンドラの現在位置を返します。バッファリングを認識しているので、単に出力ファイルに追加するだけで正確です。

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