بعد كتابة إلى ملف، لماذا لا يزال os.path.getsize إعادة حجم السابقة؟

StackOverflow https://stackoverflow.com/questions/1013778

  •  06-07-2019
  •  | 
  •  

سؤال

واني اسعى الى تقسيم ملف 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))

وتشغيل هذا يطبع 0 مثل حجم الملف حوالي 80 تكرارات ثم 4176. هل بيثون تخزين الإخراج في المخزن المؤقت قبل إخراج فعلا؟

هل كانت مفيدة؟

المحلول

نعم، بيثون والتخزين المؤقت الإخراج الخاص بك. تريد ان تكون أفضل حالا تتبع حجم نفسك، شيء من هذا القبيل:

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

(وهذا قد لا تكون دقيقة بنسبة 100٪، على سبيل المثال. على ويندوز كل سطر سيكتسب بايت بسبب فاصل خط \r\n، ولكن يجب أن تكون جيدة بما يكفي للتجزئة معلومات بسيطة).

نصائح أخرى

وحجم الملف يختلف عن موقف الملف. على سبيل المثال،

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

وبالضبط يعود حجم الملف بالبايت.

ولكن

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

وهنا f.tell () إرجاع الوضع الحالي للمعالج ملف - أي حيث الكتابة القادم سيضع البيانات الخاصة به. لأنه يدرك التخزين المؤقت، وينبغي أن تكون دقيقة طالما كنت ببساطة إلحاق إلى ملف الإخراج.

هل حاولت استبدال os.path.getsize مع os.tell، مثل هذا:

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

وتتبع حجم نفسك سوف يكون على ما يرام لقضيتك. وهناك طريقة مختلفة تتمثل في تدفق المخازن المؤقتة الملف فقط قبل التحقق من حجم:

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

والقيام التي كثيرا ما سوف تبطئ ملف I / O، بطبيعة الحال.

لتجد الإزاحة إلى نهاية الملف:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top