Dateigröße herausfinden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

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
äh, nimm diese schlange von meinem hals.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

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!!
Zuletzt geändert von helmut am Dienstag 14. März 2006, 13:29, insgesamt 1-mal geändert.
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

> Meinst du evtl. os.stat():

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

r2d2
äh, nimm diese schlange von meinem hals.
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

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
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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
mfg

Thomas :-)
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

r2d2 hat geschrieben:ich will keine zusätzlichen Module laden.
Ernst gemeinte Frage: Warum?
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

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
äh, nimm diese schlange von meinem hals.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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

Thomas :-)
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

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
äh, nimm diese schlange von meinem hals.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
--- Heiko.
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

danke, ich habe mir die Module angeschaut.

r2d2
äh, nimm diese schlange von meinem hals.
Antworten