2009-04-23 8 views
6

Wenn der folgenden Python-Code ausgeführt wird:seek(), dann lesen(), dann schreiben() in Python

>>> f = open(r"myfile.txt", "a+")   
>>> f.seek(-1,2)           
>>> f.read()            
'a'              
>>> f.write('\n')           

ich die folgende (hilfreich) Ausnahme:

Traceback (most recent call last):  
    File "<stdin>", line 1, in <module> 
IOError: [Errno 0] Error   

die gleiche passiert beim Öffnen mit "r +".

Soll das scheitern? Warum?

Edit:

  1. Offensichtlich ist dies nur ein Beispiel, nicht das, was ich versuche tatsächlich auszuführen. Mein eigentliches Ziel war es zu verifizieren, dass die Dateien mit "\ n" enden, oder eins hinzufügen, bevor die neuen Zeilen hinzugefügt werden.
  2. Ich arbeite unter Windows XP, und sie existiert in Python 2.5 und Python 2.6.
  3. ich es geschafft, das Problem zu umgehen, indem sie versuchen,() aufrufen wieder:

    f = open (r "myfile.txt", "a +")
    f.seek (-1 , 2)
    f.read()
    'a'
    f.seek (-10,2)
    f.write ('\ n')

Die aktuellen Parameter des zweiten Anruf nicht versuchen Rolle zu spielen.

+0

Welches Betriebssystem und welche Python-Version verwenden Sie? Dies scheint mit Python 2.4.3 unter Linux 2.6.17 gut zu funktionieren. –

+0

Wollen Sie genau das machen, oder ist es eine Vereinfachung? Wenn das die Aufgabe ist, warum öffnen Sie nicht einfach 'a' und rufen Sie dann f.write, ohne dazwischen zu suchen? – kyle

+0

Auch (zu Lance) funktioniert es in Python 2.5 unter Windows XP überhaupt nicht. – kyle

Antwort

4

Dies scheint ein Windows-spezifisches Problem zu sein - http://bugs.python.org/issue1521491 für ein ähnliches Problem sehen .

Noch besser ist, eine Abhilfe gegeben und erklärt bei http://mail.python.org/pipermail/python-bugs-list/2005-August/029886.html, einfügen:

f.seek(f.tell()) 

zwischen der read() und write() aufruft.

+2

Oder eher, f.seek (0, 1), um einen zusätzlichen Funktionsaufruf zu vermeiden. – tzot

+0

Ich stoße auf ein ähnliches Problem, das durch diesen Trick gelöst wird, aber ich benutze Xubuntu 15.04 mit Python 3.4.3. Siehe [meine Frage] (https://stackoverflow.com/questions/40552106/file-object-methods-write-or-writeline-start-writing-at-unexpected-position) –

2

der a + -Modus ist zum Anhängen, wenn Sie & schreiben möchten, suchen Sie nach r +.

versuchen Sie dies:

>>> f = open("myfile.txt", "r+") 
>>> f.write('\n') 

Edit:

Sie Ihre Plattform zunächst angegeben haben, sollten ... gibt es bekannte Probleme mit im Fenster zu suchen. Beim Versuch, zu suchen, haben UNIX und Win32 unterschiedliche Zeilenenden, LF bzw. CRLF. Es gibt auch ein Problem mit dem Lesen bis zum Ende einer Datei. Ich denke, Sie suchen nach dem Such (2) Offset für das Ende der Datei, dann weiter von dort.

diese Artikel können Sie von Interesse (die zweiten genauer gesagt) sein:

http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-08/2512.html

http://mail.python.org/pipermail/python-list/2002-June/150556.html

+0

Aus diesem Grund sagt Daphnas Frage: "Das Gleiche passiert, wenn du mit" r + "öffnest." – sblom

0

Werke für mich:

$ echo hello > myfile.txt 
$ python 
Python 2.5.2 (r252:60911, Oct 5 2008, 19:24:49) 
[GCC 4.3.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> f = open('myfile.txt', 'r+') 
>>> f.seek(-1, 2) 
>>> f.tell() 
5L 
>>> f.read() 
'\n' 
>>> f.write('\n') 
>>> f.close() 

Sind Sie auf Windows? Wenn ja, versuchen Sie 'rb+' anstelle von 'r+' im Modus.

Verwandte Themen