Nach dem Schreiben in eine Datei, warum nicht zurückgibt os.path.getsize noch die vorherige Größe?

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich versuche, eine große XML-Datei in kleinere Stücke aufzuteilen. Ich schreibe in die Ausgabedatei und dann seine Größe überprüfen, um zu sehen, ob sich eine Schwelle überschritten, aber ich glaube nicht, daß die getsize () Methode arbeitet wie erwartet.

Was ist ein guter Weg wäre, die Dateigröße einer Datei zu erhalten, die in der Größe verändert.

Ive getan etwas wie dieses ...

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

läuft diese druckt 0 als Dateigröße für etwa 80 Wiederholungen und dann 4176. Does Python speichert die Ausgabe in einem Puffer, bevor es tatsächlich ausgibt?

War es hilfreich?

Lösung

Ja, Python puffert die Ausgabe. Sie wären besser dran, die Größe selbst, so etwas wie dieses Tracking:

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

(Das könnte nicht zu 100% korrekt, z. B. unter Windows jede Zeile wird ein Byte gewinnt wegen des \r\n Linie Separators, aber es sollte genug für einfaches Chunking gut sein.)

Andere Tipps

Dateigröße unterscheidet sich von Dateiposition. Zum Beispiel:

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

Es gibt genau Dateigröße in Byte.

Aber

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

Hier f.tell () gibt die aktuelle Position des Dateihandler - das heißt, wo der nächste Schreib seine Daten stellen wird. Da es sich der Pufferung ist, sollte es genau so lang sein, wie Sie einfach in die Ausgabedatei anhängen.

Haben Sie versucht, mit os.tell zu ersetzen os.path.getsize, wie folgt aus:

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

Das Verfolgen der Größe selbst wird für Ihren Fall in Ordnung sein. Eine andere Möglichkeit wäre es, die Dateipuffer nur zu spülen, bevor Sie die Größe überprüfen:

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

zu tun, dass zu oft verlangsamt Datei-I / O, natürlich.

die Offset zum Ende einer Datei zu finden:

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

Ein echtes Beispiel - lesen Updates in eine Datei und drucken Sie sie, wie sie geschehen:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top