2009-06-18 28 views
12

Tôi đang cố gắng chia nhỏ một tệp xml lớn thành các đoạn nhỏ hơn. Tôi viết vào tập tin đầu ra và sau đó kiểm tra kích thước của nó để xem nếu nó vượt qua một ngưỡng, nhưng tôi không nghĩ rằng phương thức getize() đang hoạt động như mong đợi.Sau khi ghi vào một tệp, tại sao os.path.getsize vẫn trả lại kích thước trước đó?

Điều gì sẽ là một cách hay để tải tệp của một tệp đang thay đổi về kích thước.

Ive làm điều gì đó như thế này ...

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

chạy này in 0 như filesize khoảng 80 lần lặp và sau đó 4176. Liệu Python lưu trữ đầu ra trong một bộ đệm trước khi thực sự xuất ra nó?

Trả lời

9

Có, Python đang lưu vào bộ đệm của bạn. Bạn muốn được tốt hơn theo dõi kích thước chính mình, một cái gì đó như thế này:

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

(Điều đó có thể không chính xác 100%, ví dụ như trên Windows mỗi dòng sẽ đạt được một byte vì tách \r\n dòng, nhưng nó. nên đủ tốt để chunking đơn giản.)

+0

Cảm ơn! Cần làm việc. Tôi không cần nó chính xác 100%. – Maulin

3

Theo dõi kích thước chính mình sẽ ổn cho trường hợp của bạn. Một cách khác nhau sẽ để tuôn ra bộ đệm tập tin ngay trước khi bạn kiểm tra kích thước:

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

Làm điều đó quá thường xuyên sẽ làm chậm tập tin I/O, tất nhiên.

5

Bạn đã cố gắng để thay thế os.path.getsize với os.tell, như thế này:

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

Kích thước là khác nhau từ vị trí tập tin. Ví dụ:

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

Nó trả về kích thước tệp theo byte.

Nhưng

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

Đây f.tell() trả về vị trí hiện tại của trình điều khiển file - ví dụ: nơi ghi tiếp theo sẽ đưa dữ liệu của nó. Vì nó nhận thức được bộ đệm, nó phải chính xác miễn là bạn chỉ đơn giản là phụ thêm vào tệp đầu ra.

1

Để tìm được bù đắp đến cuối của một tập tin:

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

dụ Bất động thế giới - đọc cập nhật vào một tập tin và in chúng khi chúng xảy ra:

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 
Các vấn đề liên quan