2009-06-18 2 views
12

Я пытаюсь разделить большой XML-файл на более мелкие куски. Я пишу в выходной файл, а затем проверяю его размер, чтобы узнать, прошел ли он порог, но я не думаю, что метод getsize() работает должным образом.После записи в файл, почему os.path.getsize все еще возвращает предыдущий размер?

Что было бы хорошим способом получить размер файла, который изменяется в размере.

Ive сделал что-то вроде этого ...

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

работает это печатает 0 как размер_файл в течение приблизительно 80 итераций, а затем 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)) 

(Это не может быть 100% точным, например, на Windows, каждая строка будет получить байт из сепаратора \r\n линии, но его. должен быть достаточно хорош для простого фрагментации.)

+0

Спасибо! Это должно сработать. Мне не нужно, чтобы он был на 100% точным. – Maulin

3

Отслеживание размера самостоятельно будет в порядке для вашего дела. Другой способ будет смывать файловые буферы просто, прежде чем проверить размер:

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

Doing, что слишком часто будет замедлять файл I/O, конечно.

5

Вы пытались заменить os.path.getsize с os.tell, как это:

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

Размер файла отличается от позиции файла. Например,

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

Он точно возвращает размер файла в байтах.

Но

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

Здесь 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