Seite 1 von 1

Dateigröße herausfinden

Verfasst: Dienstag 14. März 2006, 13:08
von r2d2
ich kann die Größe einer geöffneten Datei mit

Code: Alles auswählen

>>> textfile = file('C:/datei.txt', 'r')
>>> textfile.seek(0,2)
>>> print textfile.tell()
404755L
herausfinden.

geht das auch direkter?
(ohne ein zusätzliches modul zu laden z.B.: os, pathinfo ... )
Wird die Dateigröße irgendwo in einer Variable festgehalten?

danke
r2d2

Verfasst: Dienstag 14. März 2006, 13:25
von jens

Verfasst: Dienstag 14. März 2006, 13:28
von helmut
Eine andere Loesung, jedoch auch ueber den Import von os, ist:

Code: Alles auswählen

import os
size = os.stat('path')[6]
Gruss, Helmut

Edit: Da war Jens schneller!!

Verfasst: Dienstag 14. März 2006, 13:29
von r2d2
> Meinst du evtl. os.stat():

nein, eben nicht.
ich will keine zusätzlichen Module laden.

r2d2

Verfasst: Dienstag 14. März 2006, 16:20
von querdenker
Ohne Zusatzmodul:


Code: Alles auswählen

fh = file('some/path/to/file','rb')
data=fh.read()
sizeOfFile=len(data)
Wobei das völlig unsinnig ist, spätestens wenn du auf große Dateien stösst!

mfg, querdenker

Verfasst: Dienstag 14. März 2006, 16:49
von Python 47
querdenker hat geschrieben:

Code: Alles auswählen

fh = file('some/path/to/file','rb')
data=fh.read()
sizeOfFile=len(data)
dann hätte er die Byte, um das in Mbyte umzuwandeln musst du folgendes machen:

Code: Alles auswählen

fh = file('some/path/to/file','rb')
data=fh.read()
sizeOfFile=len(data)/1048576
print sizeOfFile

Verfasst: Dienstag 14. März 2006, 16:52
von Joghurt
r2d2 hat geschrieben:ich will keine zusätzlichen Module laden.
Ernst gemeinte Frage: Warum?

Verfasst: Dienstag 14. März 2006, 17:19
von r2d2
Warum?
Damit es schnell läuft.
ausserdem finde ich, ein ganzes Modul zu laden, nur um eine einzige Funktion zu nutzten, unsinnig.
Bei meinem Tool werden schon ohnehin große Dateien verarbeitet (was etwas länger dauert), da will ich an anderer Stelle optimieren.
Ich bin ja nicht Microsoft. :P

r2d2

Verfasst: Dienstag 14. März 2006, 17:27
von Joghurt
Also den "Overhead" von import kannst du guten Gewissens vernachlässigen.

Du redest hier von Zeiten im Millisekundenbereich; dem Endanwender ist es ziemlich wurscht, ob es 100ms oder 200ms warten muss.

Außerdem ist das ganze einlesen der Datei um ein vielfaches langsamer. Denke immer daran: "Preliminary optimization is the rool of all evil"

Schreibe erst einmal das Programm fertig. Wenn es dann funktioniert und zu langsam ist, nutze einen Profiler, um zu sehen, wo es lohnt, zu optimieren.

Verfasst: Dienstag 14. März 2006, 17:29
von Python 47
r2d2 hat geschrieben:Warum?
ausserdem finde ich, ein ganzes Modul zu laden, nur um eine einzige Funktion
Du musst ja nicht folgendes machen:

Code: Alles auswählen

import os
sondern kannst nur stat importieren also:

Code: Alles auswählen

from os import stat
So importierst du nur eine einzige Funktion(stat) von dem ganzen Modul(os)

Verfasst: Dienstag 14. März 2006, 20:42
von querdenker
Python Master 47 hat geschrieben:...So importierst du nur eine einzige Funktion(stat) von dem ganzen Modul(os)
Wenn ich mich richtig erinnere, wird trotzdem das ganze Modul geladen.
Bin jetzt zu faul, danach zu suchen, aber ich meine es auch schon hier im Forum gelesen zu haben.

mfg, querdenker

Verfasst: Dienstag 14. März 2006, 20:51
von jens
Wie dem auch sei... Import's sind ein Kernbestandteil von Python... Das weg zu rationalisieren ist IMHO völlig Sinnlos... Es sei denn mach hat nur python.exe, den nackigen Interpreter vor sich ;)

Verfasst: Dienstag 14. März 2006, 23:42
von r2d2
es geht bei mir auch darum etwaige distribution per py2exe zu erleichtern.
ich weiss nicht, ob es nötig wird, aber ich will mir einfach keine wege zubauen. ich will mein tool als opensource projekt für andere zu verfügung stellen und will die, die kein python auf platte haben, nicht aussperren.
ausserdem bin ich ein c-jünger und leide innerlich, wenn meine programme zu fett werden.

r2d2

Verfasst: Mittwoch 15. März 2006, 00:02
von modelnine
Ein importieren wird genau einmal getan, nämlich wenn das entsprechende Modul (ws den import Befehl enthält) zum ersten mal geladen wird, direkt nachdem es geparsed wurde. Sprich: zu sagen dass es Zeit kostet wenn man ein Modul läd ist absoluter Käse, es ist eine Setup-Zeit über die wir reden (und keine wiederkehrende Zeit), und wenn Dein Programm nicht 10000x in der Sekunde aufgerufen wird ist diese Zeit absolut vernachlässigbar für jede reale Anwendung.

Unabhängig davon: ganz egal ob Du nun C-Jünger bist oder nicht, auch in C benutzt man die *stat()-Familie um die Dateigröße rauszukriegen (da ein open/seek/tell immer noch viel langsamer und auch (Ressourcen-)teurer als ein *stat() ist, was direkt mit dem Dateisystem kommuniziert, bzw. eben nur die Metatabellen des Dateisystems berührt, während ersteres eben die entsprechenden SYSCALLS bemühen muß um nicht nur eine Tabelle aus dem Kernel-Space zu ziehen, sondern gleich auch noch die Meta-Informationen über die Datei mit), sprich auch hier zu sagen dass Du das aus "Minimalitätsgründen" machen willst ist ziemlicher Unfug, ehrlich gesagt.

Dass Du in Python eben, im Gegensatz zu C, Namespaces hast, in denen Funktionen zusammengefasst sind, ist eben so. Und um einen Namespace mittels import einzubinden, darum wirst Du nicht drum rum kommen.

Und, zu guter letzt:

wenn der Python-Interpreter startet wird das os-Modul sowieso schon geladen, unabhängig davon was in Deinem Programm passiert:

Code: Alles auswählen

modelnine@phoenix ~ $ python
Python 2.4.2 (#1, Feb  5 2006, 17:30:13)
[GCC 4.0.2 (Gentoo 4.0.2-r3, pie-8.7.8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.modules
{... ,'posixpath': <module 'posixpath' from '/usr/lib/python2.4/posixpath.pyc'>, 'os.path': <module 'posixpath' from '/usr/lib/python2.4/posixpath.pyc'>, 'stat': <module 'stat' from '/usr/lib/python2.4/stat.pyc'>, 'sys': <module 'sys' (built-in)>, 'posix': <module 'posix' (built-in)>, 'os': <module 'os' from '/usr/lib/python2.4/os.pyc'>, ...}
>>>
(ich hab diese Liste aus Gründen der Übersichtlichkeit etwas verkürzt; da stehen noch ein paar mehr Module drin im Normalfall)

Also, es gibt keine (guten) Gründe den import os sein zu lassen, deswegen machs doch einfach mit stat.

PS: das os-Modul gehört zum Standardumfang wenn Du ein Programm py2exe-fizierst (eben aus dem zuletzt genannten Grund). Also kannst Du Dich ruhig auf das os-Modul verlassen.

Verfasst: Mittwoch 15. März 2006, 01:07
von r2d2
danke, ich habe mir die Module angeschaut.

r2d2