2009-04-23 21 views
6

Kiedy uruchomiony następujący kod Pythona:seek(), a następnie read(), a następnie napisać() w Pythonie

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

otrzymuję następujący (pomocny) wyjątek:

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

To samo coś się dzieje, gdy otwiera się z "r +".

Czy to ma się nie udać? Czemu?

Edit:

  1. Oczywiście jest to tylko przykład, a nie to, co ja rzeczywiście próbuje wykonać. Moim faktycznym celem było sprawdzenie, czy pliki kończą się "\ n", lub dodają je przed dodaniem nowych linii.
  2. Pracuję pod kontrolą systemu Windows XP, a problem występuje zarówno w Pythonie 2.5, jak i Pythonie 2.6.
  3. udało się obejść ten problem poprzez wywołanie poszukiwania() ponownie:

    F = czynna (R "Mójplik.txt", "A +")
    f.seek (-1 2)
    f.read()
    'a'
    f.seek (-10,2)
    f.write (\ n ')

Rzeczywiste parametry drugiego połączenia próbnego nie wydają się mieć znaczenia.

+0

Jakiego systemu operacyjnego i wersji Pythona używasz? Wygląda na to, że działa dobrze z Pythonem 2.4.3 pod Linuksem 2.6.17. –

+0

Czy to jest dokładnie to, co chcesz robić, czy też jest to uproszczenie? Jeśli to zadanie, to dlaczego nie po prostu otworzyć jako "a", a potem zadzwonić do f.write, bez interweniującego poszukiwania? – kyle

+0

Również (do Lance), w ogóle nie działa w Pythonie 2.5 na Windows XP. – kyle

Odpowiedz

4

To wydaje się być Windows specyficzny problem - patrz http://bugs.python.org/issue1521491 do podobnego problemu .

Jeszcze lepiej, obejście podane i wyjaśnione w http://mail.python.org/pipermail/python-bugs-list/2005-August/029886.html, należy wpisać:

f.seek(f.tell()) 

między read() i write() wywołuje.

+2

Lub raczej f.seek (0, 1), aby uniknąć dodatkowego wywołania funkcji. – tzot

+0

Mam podobny problem, który rozwiązuje ten trik, ale używam Xubuntu 15.04 z Pythonem 3.4.3. Zobacz [moje pytanie] (https://stackoverflow.com/questions/40552106/file-object-methods-write-or-writelines-startwriting-at-unexpected-position) –

2

Tryb a + służy do dodawania, jeśli chcesz przeczytać & napisz, szukasz r +.

spróbuj tego:

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

EDIT:

powinny podałeś swoją platformę początkowo ... nie są znane problemy z poszukiwania w obrębie okna. Podczas próby wyszukiwania, UNIX i Win32 mają odpowiednio różne zakończenia linii, odpowiednio LF i CRLF. Występuje również problem z odczytaniem do końca pliku. Myślę, że szukasz przesunięcia seek (2) na końcu pliku, a następnie kontynuuj.

artykuły te mogą być interesujące dla ciebie (druga dokładniej):

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

Dlatego właśnie pytanie Daphny mówi: "To samo dzieje się przy otwieraniu za pomocą" r + ". – sblom

0

roboty dla mnie:

$ 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() 

Czy jesteś na windows? Jeśli tak, spróbuj 'rb+' zamiast 'r+' w tym trybie.

Powiązane problemy