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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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

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

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

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

Ne BlackJack, nicht 7 bit sondern 8 bit. :P
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

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

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

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

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

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

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

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:

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

noise hat geschrieben: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.
Das hast du ja mal wieder ganz toll gemacht BlackJack: du nimmst mir damit meine letzte Daseinsbereichtigung. :wink: :x :D
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

Rebecca hat geschrieben:Im uebrigen ist BlackJack zwar pedantisch, aber was er erzaehlt, ist (fast) immer sachlich korrekt und konstruktiv. Was hat das mit Zerreissen zu tun?
Hallo Rebecca, ich würde (abgesehen von dem letzen Post an BlackJack und die par Albernheiten die ja jedem gestatte sein sollten) gerne wissen wo ich Unsachlich und Destruktiv war? Vielleicht würde es mir helfen zu verstehen weshalb einige meine auf mir herumtreteten zu müssen, obwohl ich erst ein par tage hier bin?

Um es klar zu stellen. Ich habe hier in meiner Kurzen Zeit keinen
- Verbal fertig gemacht,
- vor der Comunity schlecht darstellen lassen,
- Fremden Code dermaßen zerrissen (sondern lediglich wenn dan Tipps gegeben)
- Verarscht und verspottet.

Ich habe immer Versucht Sachlich zu bleiben und lediglich meinen Standpunkt dargestellt, weil jeder eben andere Ansichten hat.

Wenn Ihr das anders sieht, dann Postet doch bitte die stellen und erklärt es einen Dummen wie mir :?

noise

P.S. Auserdem wo reite ich ständig auf was rum (ausser dem hier nun)? "Ihr" (Also EyDu und BlackJack) habt doch darauf rumgeritten was für Begriffe ich zu verwenden habe und wie ich meine Sätze zu Strukturieren habe :? Ich meine, herrscht hier wirklich eine Dualität gegenüber Neulingen? Das kann es doch nicht sein...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Drehen wir die Sache mal um: vielleicht schaffst du es ja auch nicht, dich in eine bestehende Struktur einzugliedern.

Inklusive meines letzten Posts komme ich in diesem Thread gerade mal auf ein halbes dutzend Sätze und BlackJack hat ebenfalls nur unwesentlich mehr. Wie soll man denn da bitte von "zerpflücken" von Beiträgen sprechen?

Jetzt schaust du dir am besten mal deine Beiträge an und überprüfst wie viele Zitate du aufführst und auf wie viele Einzelheiten du bei anderen Posts eingehst.
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

Hallo, EyDu.
EyDu hat geschrieben:Drehen wir die Sache mal um: vielleicht schaffst du es ja auch nicht, dich in eine bestehende Struktur einzugliedern.
Das kann natürlich sein. Aber das ist natürlich nicht das einzige Forum in dem ich angemeldet bin und in anderen habe ich nicht solche Probleme und sowas zu spüren bekommen. Die meisten von den Foren sind auch nicht viel größer als dies hier und ungefähr genauso häufig von Mitgliedern besucht, so da sich nicht unbedingt denke das es auf die Größ zurückzuführen ist.
EyDu hat geschrieben:Inklusive meines letzten Posts komme ich in diesem Thread gerade mal auf ein halbes dutzend Sätze und BlackJack hat ebenfalls nur unwesentlich mehr. Wie soll man denn da bitte von "zerpflücken" von Beiträgen sprechen?

Jetzt schaust du dir am besten mal deine Beiträge an und überprüfst wie viele Zitate du aufführst und auf wie viele Einzelheiten du bei anderen Posts eingehst.
Ist das wirklich das Problem?

Was ich nicht so ganz nachvollziehen kann ist weshalb es (anscheinend) als störend empfunden wird auf viele Einzelheiten einzugehen? Ich dachte (und habe diverse male unaufgefordert bestätigt bekomme) das gerade diese Gründlichkeit von mir eine Positive stärke darstellt. Mag sein das ich in euren Augen dabei zu ausschweifend bin, aber ist den das so schlimm? Was ist den mit der Individualität?

Auch bin ich es gewohnt, immer unter Zitaten zu antworten, wegen der Übersichtlichkeit und damit der Kontext erhalten bleibt.

EDIT: Rechtschreibung.
Zuletzt geändert von noise am Montag 11. Februar 2008, 14:54, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Man, Leute, ich wollte mich eigentlich nicht einmischen, aber schaltet doch mal einen Gang zurück...

Das ist doch alles in allem lächerlich sich wegen so einem Kram aufzuregen. Ich glaube die anderen denken da ganz ähnlich und haben ähnlich wie ich schon die Hand beim Popcorn.

Die Welt wird schon nicht untergehen, wenn man ASCII falsch definiert oder wenn man Dinge unnötig kompliziert erklärt. 8)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten