2009-05-20 7 views

Antwort

5

Die a ist überflüssig. wua ist das gleiche wie wu seit w kommt zuerst und wird daher die Datei abgeschnitten. Wenn Sie die Reihenfolge umkehren würden, also auw, wäre das dasselbe wie au. Visualisierte:

>>> f = open('test.txt', 'r') 
>>> f.read() 
'Initial contents\n' 
>>> f.close() 
>>> f = open('test.txt', 'wua') 
>>> print >> f, 'writing' 
>>> f.close() 
>>> f = open('test.txt', 'r') 
>>> f.read() 
'writing\n' 
>>> f.close() 
>>> f = open('test.txt', 'auw') 
>>> print >> f, 'appending' 
>>> f.close() 
>>> f = open('test.txt', 'r') 
>>> f.read() 
'writing\nappending\n' 
>>> f.close() 

(Zur Erinnerung:. Beide a und wopen the file for writing, aber die ehemaligen Appends während die anderen Verkürzungen)

3

ich nicht feststellen, dass Sie wussten, was die Modifikatoren taten. Kombiniert werden sie folgendes tun:

A und W zusammen ist überflüssig, da beide zum Schreiben geöffnet werden. Wenn Sie W verwenden, wird die Datei überschrieben. Wenn Sie A verwenden, wird der gesamte neue Text an den vorhandenen Inhalt angehängt.

U bedeutet "Datei XXX zur Eingabe als Textdatei mit universeller Zeilenumschaltung öffnen".

  • W ist für Write
  • A für Append ist
  • U wird konvertiert die Datei die definierte Zeilenende-Zeichen zu verwenden.

hier Mehr: http://codesnippets.joyent.com/posts/show/1969

2

Unter der Haube Python 2.4 gelangt das die gebautet open ‚Argumente auf der fopen Funktion des Betriebssystems. Python führt unter bestimmten Bedingungen einen Fehler in der Moduszeichenfolge aus.

if (strcmp(mode, "U") == 0 || strcmp(mode, "rU") == 0) 
    mode = "rb"; 

Wenn Sie also einen oberen Fall passieren U oder rU es wird die Datei für binäre Lesen öffnen. Mit Blick auf die GNU-libc-Quelle und entsprechend der MSDN-Seite, die die Windows-Implementierung von beschreibt, wird die Option 'u' ignoriert.

Mit mehr als einem Modus Bezeichner (‚r‘, ‚w‘ und ‚a‘) im Modus Zeichenfolge hat keine Wirkung. Dies kann durch einen Blick auf die GNU libc Implementierung Modus Zeichenfolgenanalyse zu sehen:

switch (*mode) 
{ 
case 'r': 
    omode = O_RDONLY; 
    break; 
case 'w': 
    omode = O_WRONLY; 
    oflags = O_CREAT|O_TRUNC; 
    break; 
case 'a': 
    omode = O_WRONLY; 
    oflags = O_CREAT|O_APPEND; 
    break; 
default: 
    __set_errno (EINVAL); 
    return NULL; 
} 

Das erste Zeichen des Modus-String ist für einen ‚r‘ gesucht, ‚w‘ oder ‚a‘, wenn es nicht ist Bei einem dieser Zeichen wird ein Fehler ausgelöst.

Wenn eine Datei als "wua" geöffnet wird, wird sie daher nur zum Schreiben geöffnet, wenn sie nicht existiert und abgeschnitten wird. 'u' und 'a' werden ignoriert.

+0

Danke für die Erklärung, wie die Dinge intern implementiert werden! – balu