Anfänger: file open write sort close

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.
Schnäik
User
Beiträge: 10
Registriert: Freitag 8. Februar 2008, 17:27

Beitragvon Schnäik » Freitag 8. Februar 2008, 21:30

Wow, was seid Ihr denn hier für ein geiler Haufen?! Vielen Dank für die vielen schnellen Antworten!

Scheint als wäre der Ansatz gar nicht so verkehrt gewesen - mir kam nur das ständige File auf/ File zu etwas seltsam vor:

Code: Alles auswählen

datei  = 'test.txt'
file = open(datei, 'a+')
file.write('3 bla\n')
file.write('7 blubb\n')
file.close()

file = open(datei, 'r')
lines = file.readlines()
file.close()

file = open(datei, 'w')
file.writelines(sorted(lines))
file.close()


Gnushi hat geschrieben:Hi!
Falls das ein Realwelt-Problem ist, dann hilft die Shell weiter:

Danke - das Realwelt-Problem ist schon gelöst (Shell/Perl) aber ich dachte das wäre mal ein guter Einstieg in Python. Ist auch nur ein kleiner Teil des Ganzen...

noise hat geschrieben:

Code: Alles auswählen

f = open("test.txt", "r")
result = sorted(list(f) + ["2 text...", "7 text..."])
f.close()


`result` enthält dann das von dir gewünschte Ergebnis.

Das ist auch gut - bei mir läufts andersum. Die weiteren Ansätze hinsichtlich der Sortierung sind für mein aktuelles Problem oversized - die Zahlen zu Beginn einer Zeile haben in weiser Voraussicht alle die gleiche Länge bekommen - also mit führenden Nullen ;-) Der Rest danach würde nur bei gleicher Zahl relevant werden und spielt dann keine Rolle. Aber es ist nur eine Frage der Zeit bis was anderes kommt und deshalb habe ich mir die High-End Lösung auch mal gesichert :shock:

gerold hat geschrieben:Und was das gleichzeitige Lesen und Bearbeiten einer Textdatei betrifft -- mache es erst dann, wenn du genau weißt was du tust. Es ist nämlich so, dass du nicht einfach in der Mitte einer Datei etwas hinzufügen kannst. Du kannst etwas austauschen, aber nur so lange du damit die Größe der Datei nicht änderst.

Das ist mir im Grunde klar, das viele hin und her kam mir aber trotzdem seltsam vor. Hat das Schreiben via FOR Schleife Vorteile gegenüber file.writelines?

Als blutiger Anfänger habe ich hier und da noch das Gefühl dass ich mit Perl schneller ans Ziel komme. Aber bei der Rückendeckung hier beisse ich mich noch mal eine Weile durch. Seid selbst schuld, jetzt bin bestimmt bald mit der nächsten Frage wieder hier ;-)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 8. Februar 2008, 21:53

Hallo Schnäik!

Schnäik hat geschrieben:

Code: Alles auswählen

file = open(datei, 'a+')

1.) Das "+" brauchst du nicht. Siehe: http://docs.python.org/lib/built-in-funcs.html#l2h-54
2.) ``file`` ist ein eingebauter Typ den du hier überschreibst

Schnäik hat geschrieben:Hat das Schreiben via FOR Schleife Vorteile gegenüber file.writelines?

Es hat dann Vorteile, wenn man mit jeder einzelnen Zeile etwas tun möchte. Das gilt für ``readlines()`` und für ``writelines()``. Aber in deinem Fall hat es keinen Vorteil.

Der große Vorteil der FOR Schleife kommt dann zum Tragen, wenn man sie mit ``read()`` vergleicht. ``read()`` liest die ganze Datei in den Speicher. Wenn man mit einer FOR Schleife über die Datei iteriert, dann wird die Datei zeilenweise in den Speicher geladen. Dieser wird etwas später wieder frei gegeben.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Schnäik
User
Beiträge: 10
Registriert: Freitag 8. Februar 2008, 17:27

Beitragvon Schnäik » Freitag 8. Februar 2008, 22:07

gerold hat geschrieben:Hallo Schnäik!

Schnäik hat geschrieben:

Code: Alles auswählen

file = open(datei, 'a+')

1.) Das "+" brauchst du nicht. Siehe: http://docs.python.org/lib/built-in-funcs.html#l2h-54
2.) ``file`` ist ein eingebauter Typ den du hier überschreibst


Ups... ;-)

Danke Gerold für die Tipps!
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

Beitragvon noise » Samstag 9. Februar 2008, 00:09

EyDu hat geschrieben:Nicht zu vergessen die aktuelle Mondphase, Stau auf der A7 und danach ob sein Hund gerade schläft ;-)
Du hast mit dem Thema sortieren angefangen. Und wenn dann richtig, weil sonst ist es genauso wenig Wert wie meine ursprüngliche Lösung ;) Tja, besonders konsistent scheinst ja nicht zu sein.

Ein schönes *PLONK* und du hast dir den falschen Neuling hier im Forum ausgesucht für deine Spielchen ;)

Gnushi hat geschrieben:Er verwendet weniger Zeilen und ich sortiere ebenfalls nur nach der Nummer,
Okay, das hatte ich übersehen.

Schnäik hat geschrieben:Wow, was seid Ihr denn hier für ein geiler Haufen?!
:D

Schnäik hat geschrieben:Die weiteren Ansätze hinsichtlich der Sortierung sind für mein aktuelles Problem oversized - die Zahlen zu Beginn einer Zeile haben in weiser Voraussicht alle die gleiche Länge bekommen - also mit führenden Nullen ;-)
Das dürfte sicherlich EyDu interessieren :D

Schnäik hat geschrieben:Seid selbst schuld, jetzt bin bestimmt bald mit der nächsten Frage wieder hier ;-)
Über Fragen freuen wir uns :) Und ich sie zu beantworten, und EyDu meine Antworten auf unsachliche weise zu Kommentieren ;)
BlackJack

Beitragvon BlackJack » Samstag 9. Februar 2008, 09:13

Zu den ganzen "Vergleichern" mit dem `cmp`-Argument von `list.sort()`: Das `key`-Argument ist in der Regel vorzuziehen, weil die übergebene Funktion nur einmal pro Element aufgerufen wird, während die `cmp`-Funktion für jeden Vergleich beim Sortieren aufgerufen wird.

@noise: Die Worte "ASCII" und "Hexadezimalcode" wären nicht nötig gewesen. Es wird nach den Werten der Bytes im Bytestring verglichen, reicht als Erklärung. In welchen Zahlsystemen man die Werte darstellen kann ist egal. Ausserdem könnte Deine Erklärung mit ASCII die Frage aufwerfen, was die Vergleichsoperationen wohl mit den Werten 128 bis 255 machen. :P

@Gnushi: In Deiner `vergleich()`-Funktion kannst Du das ``if``/``elif``/``else``-Gedöns durch ``return cmp(av, bv)`` ersetzen.
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

Beitragvon noise » Montag 11. Februar 2008, 01:29

Ne BlackJack, nicht 7 bit sondern 8 bit. :P
BlackJack

Beitragvon BlackJack » Montag 11. Februar 2008, 09:27

Bitte wie meinen?
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

Beitragvon noise » Montag 11. Februar 2008, 09:50

Das bezog sich darauf:
BlackJack hat geschrieben:Ausserdem könnte Deine Erklärung mit ASCII die Frage aufwerfen, was die Vergleichsoperationen wohl mit den Werten 128 bis 255 machen. :P
BlackJack

Beitragvon BlackJack » Montag 11. Februar 2008, 09:52

Hab's immer noch nicht verstanden. :(
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

Beitragvon noise » Montag 11. Februar 2008, 10:12

BlackJack hat geschrieben:Hab's immer noch nicht verstanden. :(
Oh, okay.
Die Anspielung mit "128 bis 255" bezieht sich doch darauf dass das originale ASCII (US-ASCII) ursprünglich eine 7-Bit-Zeichenkodierung war. Also 128 Zeichen. Der Rest mit "128 bis 255" war dann ne "Erweiterung" drum in 8 bit (http://de.wikipedia.org/wiki/ASCII#Kodierung). -- Das war doch deine Intention? Oder was meintest du mit deinem Satz?

Naja, daher halt meine aussage 7-Bit und nicht 8-Bit, was andeuten soll das ich mich nicht auf US-ASCII bezogen habe :P

BTW: Ich weiß das die Erweiterungen Länderspezifisch sind.
BlackJack

Beitragvon BlackJack » Montag 11. Februar 2008, 10:53

Wo ist denn der Unterschied zwischen US-ASCII und ASCII? Schliesst ASCII noch Erweiterungen von Kanada oder südamerikanischen Ländern ein!? ;-)
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

Beitragvon noise » Montag 11. Februar 2008, 12:28

hehe ^^

ASCII, US-ASCII - Die Unterscheidung gibt es nicht. Ney, sauberer Formuliert gibt es nur ASCII und ASCII mit der Erweiterung die Länderspezifisch sind. Und ganze genau...okay das führt nun zu weit ;)

Magst du mir dennoch mal sagen worauf du mit deinem Satz hinauswolltest?
BlackJack

Beitragvon BlackJack » Montag 11. Februar 2008, 13:14

Das Du in Deinem zweiten Beitrag hier unnötigerweise "hexadezimal" und unkorrekterweise "ASCII" zur Erklärung der Sortierung von Bytestrings verwendet hast und zu EyDu meintest man könne das ohne die Begriffe nicht erklären ohne es in eine Roman ausarten zu lassen.

In dem selben Beitrag schreibst Du, das wären Grundbegriffe die man kennen sollte. Lern' doch erst einmal die Basics bevor Du Beiträge so pedantisch Satz für Satz auseinander pflückst und den Korinthenkacker heraus hängen lässt. ;-)
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

Beitragvon noise » Montag 11. Februar 2008, 13:49

BlackJack hat geschrieben:Das Du in Deinem zweiten Beitrag hier unnötigerweise "hexadezimal" und unkorrekterweise "ASCII" zur Erklärung der Sortierung von Bytestrings verwendet hast und zu EyDu meintest man könne das ohne die Begriffe nicht erklären ohne es in eine Roman ausarten zu lassen.


Aha, das wolltest du damit
BlackJack hat geschrieben:Ausserdem könnte Deine Erklärung mit ASCII die Frage aufwerfen, was die Vergleichsoperationen wohl mit den Werten 128 bis 255 machen. :P
sagen? Und jetzt fängst du auch an mir vorzuschreiben wie ich meine Sätze zu strukturieren habe und was ich für Begriffe in den Mund nehmen darf!? Das ist doch nicht dein ernst!!
http://www.python-forum.de/post-89709.html#89709


Okay dann mal eine Grundkurs nur für dich. Was soll mit den Werten 128 bis 255 bei einem Bytestring sein!? Nichts.

Code: Alles auswählen

>>> chr(47)
'/'
>>> chr(128)
'\x80'
>>> chr(255)
'\xff'
>>> chr(256)

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    chr(256)
ValueError: chr() arg not in range(256)
>>> # ahhh, wer hätte das gedacht! :roll:
>>> "spam" < "eggs"
False
>>> sorted(["spam", "eggs"])
['eggs', 'spam']
>>> l = None
>>> for i in xrange(128, 256):
       if l is not None:
                assert chr(l) < chr(i)
   l = i

   
>>> # alles klar?



BlackJack hat geschrieben:In dem selben Beitrag schreibst Du, das wären Grundbegriffe die man kennen sollte.
Genau.

BlackJack hat geschrieben: Lern' doch erst einmal die Basics bevor Du Beiträge so pedantisch Satz für Satz auseinander pflückst und den Korinthenkacker heraus hängen lässt. ;-)
Aha, da kneift es also? Du magst nicht das man dein Geschreibsel interpretiert? Hättest nicht gedacht das ich wusste worauf du mit deiner Frage hinauswolltest? Davon abgesehen bist du es doch der hier den lieben langen Tag Sätze und fremden Code pedantisch auseinander pflückt, zerreist und andere mit deinem Sarkasmus vor die wand fährt.

Und welches recht hast du mich einen Korinthenkacker zu nennen? Gehe ich so mit dir um? Sowas asoziales wie dich habe ich ja selten erlebt. :x

---

Wie ich eben schon zu Gerold geschrieben habe, habt ihr von euren 4081 Usern jetzt den 3501 User der euer ach so soziales Forum nicht mehr besucht.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Montag 11. Februar 2008, 14:13

noise hat geschrieben:
BlackJack hat geschrieben: Lern' doch erst einmal die Basics bevor Du Beiträge so pedantisch Satz für Satz auseinander pflückst und den Korinthenkacker heraus hängen lässt. ;-)
Aha, da kneift es also? Du magst nicht das man dein Geschreibsel interpretiert? Hättest nicht gedacht das ich wusste worauf du mit deiner Frage hinauswolltest? Davon abgesehen bist du es doch der hier den lieben langen Tag Sätze und fremden Code pedantisch auseinander pflückt, zerreist und andere mit deinem Sarkasmus vor die wand fährt.

Und welches recht hast du mich einen Korinthenkacker zu nennen? Gehe ich so mit dir um? Sowas asoziales wie dich habe ich ja selten erlebt. :x

Weisst du, wofuer dieser hier gut ist: :wink: ?

Im uebrigen ist BlackJack zwar pedantisch, aber was er erzaehlt, ist (fast) immer sachlich korrekt und konstruktiv. Was hat das mit Zerreissen zu tun?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder