www.vorkurse.de
Ein Projekt von vorhilfe.de
Die Online-Kurse der Vorhilfe

E-Learning leicht gemacht.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Teams · Forum · Wissen · Kurse · Impressum
Forenbaum
^ Forenbaum
Status Mathe-Vorkurse
  Status Organisatorisches
  Status Schule
    Status Wiederholung Algebra
    Status Einführung Analysis
    Status Einführung Analytisc
    Status VK 21: Mathematik 6.
    Status VK 37: Kurvendiskussionen
    Status VK Abivorbereitungen
  Status Universität
    Status Lerngruppe LinAlg
    Status VK 13 Analysis I FH
    Status Algebra 2006
    Status VK 22: Algebra 2007
    Status GruMiHH 06
    Status VK 58: Algebra 1
    Status VK 59: Lineare Algebra
    Status VK 60: Analysis
    Status Wahrscheinlichkeitst

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Python" - Code bricht ab
Code bricht ab < Python < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Python"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Code bricht ab: Code funktioniert nicht
Status: (Frage) beantwortet Status 
Datum: 23:30 Di 23.12.2014
Autor: Marcel

Hallo,

folgenden Code habe ich einem Buch entnommen, er läuft aber nicht:
1: SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], 1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
2:
3: def approximate_size(size, a_kilobyte_is_1024_bytes=True):
4:     '''Convert a file size to human-readable form.
5:     Keyword arguments:
6:     size -- file size in bytes
7:     a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
8:                                 if False, use multiples of 1000
9:
10:
11:     Returns: string
12:     
13:
14: '''
15:     if size < 0:
16:         raise ValueError('number must be non-negative')
17:
18:     multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
19:     for suffix in SUFFIXES[multiple]:
20:         size /= multiple
21:         if size < multiple:
22:             return '{0:.1f} {1}'.format(size, suffix)
23:         raise ValueError('number too large')
24:
25: if __name__ == '__main__':
26:     print(approximate_size(1000000000000, False))
27:   print(approximate_size(1000000000000))


Fehlermeldung:
python humansize.py
File "humansize.py", line 27
print(approximate_size(1000000000000))


Hat jemand 'ne Idee? Denn eigentlich wollte ich mich mal ein bisschen in
Python einarbeiten...

Gruß,
  Marcel

        
Bezug
Code bricht ab: Antwort
Status: (Antwort) fertig Status 
Datum: 23:43 Di 23.12.2014
Autor: felixf

Moin Marcel!

> Hallo,
>  
> folgenden Code habe ich einem Buch entnommen, er läuft
> aber nicht:
>  
1: SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 
2: > 'EB', 'ZB', 'YB'], 1024: ['KiB', 'MiB', 'GiB', 'TiB', 
3: > 'PiB', 'EiB', 'ZiB', 'YiB']}
4: >  
5: > def approximate_size(size, a_kilobyte_is_1024_bytes=True):
6: >      '''Convert a file size to human-readable form.
7: >      Keyword arguments:
8: >      size -- file size in bytes
9: >      a_kilobyte_is_1024_bytes -- if True (default), use 
10: > multiples of 1024
11: >                                  if False, use multiples of 
12: > 1000
13: >  
14:
15: > Returns: string
16: >      
17:
18: >  '''
19: >      if size < 0:
20: >          raise ValueError('number must be non-negative')
21: >  
22: > multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
23: >      for suffix in SUFFIXES[multiple]:
24: >          size /= multiple
25: >          if size < multiple:
26: >              return '{0:.1f} {1}'.format(size, suffix)
27: >          raise ValueError('number too large')
28: >  
29: > if __name__ == '__main__':
30: >      print(approximate_size(1000000000000, False))
31: >   print(approximate_size(1000000000000))


Die Anzahl Leerzeichen vor print weicht in den beiden Zeilen voneinander ab. Das ist in Python ein Syntaxfehler.

> Fehlermeldung:
> python humansize.py
> File "humansize.py", line 27
>  print(approximate_size(1000000000000))

Ist das alles, was ausgegeben wurde?

LG Felix


Bezug
                
Bezug
Code bricht ab: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 23:44 Di 23.12.2014
Autor: felixf

Moin Marcel

> > if __name__ == '__main__':
>  >      print(approximate_size(1000000000000, False))
>  >   print(approximate_size(1000000000000))[/code]
>  
> Die Anzahl Leerzeichen vor print weicht in den beiden
> Zeilen voneinander ab. Das ist in Python ein Syntaxfehler.

Es kann auch sein, dass du Leerzeichen und Tabs mischt. Das solltest du in Python auf keinen Fall, das endet oft mit Fehlermeldungen oder mindestens Warnungen.

LG Felix


Bezug
                
Bezug
Code bricht ab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 15:51 Mi 24.12.2014
Autor: Marcel

Hallo Felix,

ja, die Fehlermeldung war alles. Ich teste das mal mit den Leerzeichen und
Tabs. Eigentlich habe ich den Code per C&P erstellt, daher muss ich mal
gucken, was da passiert ist...

Edit: Da ich den Fehler immer noch nicht finde, hänge ich einfach mal die
Textdatei an:

    [a]humansize.py

Gruß,
  Marcel

Dateianhänge:
Anhang Nr. 1 (Typ: py) [nicht öffentlich]
Bezug
                        
Bezug
Code bricht ab: Antwort
Status: (Antwort) fertig Status 
Datum: 17:25 Mi 24.12.2014
Autor: Event_Horizon

Hallo!

Du hast da eindeutig ein Problem. Schau mal:

1:
2: ....if size < 0:
3: ........raise ValueError('number must be non-negative')
4:
5: ....multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
6: ....for suffix in SUFFIXES[multiple]:
7: ........size /= multiple
8: ........if size < multiple:
9: ............return '{0:.1f} {1}'.format(size, suffix)
10: ........raise ValueError('number too large')
11:
12: if __name__ == '__main__':
13: ....print(approximate_size(1000000000000, False))
14: >   >   print(approximate_size(1000000000000))


Ich habe die Leerzeichen durch Punkte, und die tabs durch ">" dargestellt.

Python ist es recht egal, wenn du bis Zeile 12 in meinem Code Leerzeichen nimmst, und danach Tabs.  Du darfst sie nur nicht mixen.

Hier taucht das Problem auf, daß viele Texteditoren gerne beim Drücken von Tab einfach eine bestimmte Anzahl Leerzeichen einfügen, meist 4 oder 8. Andere wiederum fügen tatsächlich ein Tabulator-zeichen ein.
Aus meiner Sicht ist nur das letzte das wirklich ware, weil man dann durch Backspace eine Einrückung vollständig entfernen kann, während man sonst vier mal Backspace drücken muss. (es gibt zwar Editoren, die meinen, das zu können, aber es kommt immer wieder zu Problemen.)
Ungemütlich wird es dann, wenn man ein und den selben Code mit unterschiedlichen Editoren bearbeitet, die sich alle anders verhalten.

Du kannst mal einen Editor wie Notepad++ benutzen, der auch unsichtbare Zeichen anzeigen kann. Dann wird dir sowas schnell auffallen.

Es gibt nun tatsächlich noch ein problem: Wenn nicht schon beim ersten Durchlauf der FOR-Schleife die IF-Bedingung erfüllt ist, rennt der Code danach sofort in das raise VaueError.  Du mußt diese Zeile einmal weniger einrücken, damit sie nicht innerhalb der FOR-Schleife ausgeführt wird. Wenn ich das korrigiere, bekomme ich als Ausgabe:

1.0 TB
931.0 GiB


Und jetzt Knecht Ruprecht: 1TByte funktioniert ja. Und wenn du mal 900 Byte versuchst?

Bezug
                                
Bezug
Code bricht ab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 22:22 Mi 24.12.2014
Autor: Marcel

Hallo Event_Horizon,

> Hallo!
>  
> Du hast da eindeutig ein Problem. Schau mal:
>  
>
1:
2: >  ....if size < 0:
3: >  ........raise ValueError('number must be non-negative')
4: >  
5: > ....multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
6: >  ....for suffix in SUFFIXES[multiple]:
7: >  ........size /= multiple
8: >  ........if size < multiple:
9: >  ............return '{0:.1f} {1}'.format(size, suffix)
10: >  ........raise ValueError('number too large')
11: >  
12: > if __name__ == '__main__':
13: >  ....print(approximate_size(1000000000000, False))
14: >  >   >   print(approximate_size(1000000000000))


>  
> Ich habe die Leerzeichen durch Punkte, und die tabs durch
> ">" dargestellt.
>  
> Python ist es recht egal, wenn du bis Zeile 12 in meinem
> Code Leerzeichen nimmst, und danach Tabs.  Du darfst sie
> nur nicht mixen.
>  
> Hier taucht das Problem auf, daß viele Texteditoren gerne
> beim Drücken von Tab einfach eine bestimmte Anzahl
> Leerzeichen einfügen, meist 4 oder 8. Andere wiederum
> fügen tatsächlich ein Tabulator-zeichen ein.
> Aus meiner Sicht ist nur das letzte das wirklich ware, weil
> man dann durch Backspace eine Einrückung vollständig
> entfernen kann, während man sonst vier mal Backspace
> drücken muss. (es gibt zwar Editoren, die meinen, das zu
> können, aber es kommt immer wieder zu Problemen.)
>  Ungemütlich wird es dann, wenn man ein und den selben
> Code mit unterschiedlichen Editoren bearbeitet, die sich
> alle anders verhalten.

ich habe, da ich gerade nichts anderes benutzen wollte, einfach das
TexnicCenter benutzt. Ich schau' mich mal nach einem anderen Editor
um.
  

> Du kannst mal einen Editor wie Notepad++ benutzen, der auch
> unsichtbare Zeichen anzeigen kann. Dann wird dir sowas
> schnell auffallen.

Danke, werde ich mal testen.

> Es gibt nun tatsächlich noch ein problem: Wenn nicht schon
> beim ersten Durchlauf der FOR-Schleife die IF-Bedingung
> erfüllt ist, rennt der Code danach sofort in das raise
> VaueError.  Du mußt diese Zeile einmal weniger einrücken,

Mache ich.

> damit sie nicht innerhalb der FOR-Schleife ausgeführt
> wird. Wenn ich das korrigiere, bekomme ich als Ausgabe:
>  
> 1.0 TB
>  931.0 GiB
>  
>
> Und jetzt Knecht Ruprecht: 1TByte funktioniert ja. Und wenn
> du mal 900 Byte versuchst?

Ich teste erstmal, ob ich das Programm überhaupt zum Laufen bringe. :-)

P.S. Du kennst das Buch, oder war die Testeingabe zufällig genauso wie
dort? :-)

Edit: Jetzt bekomme ich zwar eine Ausgabe, aber immer

1.0 TB
931.0 GiB

Eigentlich sollte das Programm ja den String einlesen und entsprechend
umrechnen. Ist da noch was falsch?

Ich muss auch ehrlich sagen: Normalerweise kenne ich mich in der
Programmierung etwas aus (Matlab, Octave, R, ..., in C etwas), aber
hier weiß ich zwar immer, was gemacht werden soll, aber die Syntax
ist mir nicht immer klar. Alleinde schon dieses "=TRUE" finde ich an
den entsprechenden Stellen komisch.
Aber die Autoren im Buch meinten, man könne erst mal das Programm
laufen lassen, sie erklären es dann danach. Daher halte ich mich an
diese Strategie, nur sollte das Ding dafür auch mal richtig funktionieren. ;-)

Gruß,
  Marcel

Bezug
                                        
Bezug
Code bricht ab: Antwort
Status: (Antwort) fertig Status 
Datum: 00:24 Do 25.12.2014
Autor: Event_Horizon

Hallo!

Dein Code enthält die ganze Zeit die Zeile(n)

print(approximate_size(1000000000000))

sprich, das wird immer nur ~1TB ausgeben, sonst nix. Ich weiß nichts von einem Buch...

Wenn du von einem String sprichst: Den mußt du ja erstmal einlesen, z.B. so:


n=int(raw_input("Bitte Zahl eingeben: "))
print(approximate_size(n))

Das raw_input() liefert dir einen String, welchen du erstmal in eine ganze Zahl umwandeln mußt, daher das int().

Bezug
                                                
Bezug
Code bricht ab: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 02:24 Fr 26.12.2014
Autor: Marcel

Hallo Event_Horizon,

> Hallo!
>  
> Dein Code enthält die ganze Zeit die Zeile(n)
>  
> print(approximate_size(1000000000000))
>  
> sprich, das wird immer nur ~1TB ausgeben, sonst nix. Ich
> weiß nichts von einem Buch...

kein Problem, ich kann's Dir nennen. ;-)
  

> Wenn du von einem String sprichst: Den mußt du ja erstmal
> einlesen, z.B. so:
>  
>
> n=int(raw_input("Bitte Zahl eingeben: "))
>  print(approximate_size(n))
>  
> Das raw_input() liefert dir einen String, welchen du
> erstmal in eine ganze Zahl umwandeln mußt, daher das
> int().

Okay, das kenne ich analog aus Matlab (input-Befehl). Dann nehme ich
mal an, dass die im Buch den Codeteil verloren haben (mir kam das auch
merkwürdig vor, was dort steht - es steht aber nun mal so da).

Bzw. es kann sein, dass da einfach nur diese Umrechnung ausgegeben
werden soll (1TB - 931.3 GiB); und dieses Einlesen des Strings etc. erst
später kommt, wobei sie dann das Programm abändern. Das klingt dann
logisch. (Vielleicht sollte ich jetzt einfach erstmal weiterlesen; aller Anfang
ist halt schwer... .)

Aber dennoch ist das Programm dann komisch geschrieben. Jetzt läuft's
aber wenigstens, daher: Danke. :-)
(Nachträglich frohe Festtage und einen guten Rutsch schonmal!)

Gruß,
  Marcel

Bezug
                                                        
Bezug
Code bricht ab: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 16:18 Fr 26.12.2014
Autor: Event_Horizon

Hallo!

Naja, das kann so sein:

Du hast hier eine Python-Datei mit dieser Funktion approximateSize(), oder wie sie gleich noch hieß.

Du kannst diese Datei mit 'import' in eine andere Python-Datei einbinden (ähnlich #include in C), und die Funktion benutzen.

ABER du kannst die Datei selbst auch ausführen, dafür ist das

if __name__ == '__main__':


gut. Es prüft, ob diese Datei direkt ausgeführt wird, oder eben nicht (d.h. per import von ner anderen Datei eingebunden wurde)

Das mit der Benutzereingabe kann also in ner anderen Datei stehen.

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Python"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.vorkurse.de
[ Startseite | Mitglieder | Teams | Forum | Wissen | Kurse | Impressum ]