2013-10-09 10 views
6

Python/programowanie newbie tutaj.Python - "IOError: [Errno 0] Error". Co to jest wyzwalanie tego błędu w moim kodzie?

Mam skrypt, który powinien dołączyć coś do pliku, ale wywołuje błąd, którego nie rozumiem i nie wiem, jak jest on wyzwalany.

Oto kod:

import re 

num_words = "four kiddiewinks|four children|four kids" 
words_list = num_words.split('|') 

def append_2synonym(words_list, num_words): 
    with open('test2 words.txt', 'a+') as f: 
     read_f = f.read() 
     patt = r'^' + words_list[0] + '\|' 
     result = re.search(patt, read_f, re.MULTILINE) 
     if result == None: 
      f.write("\n" + num_words) 
     else: 
      print "\nNo match found in '2 words.txt' file" 

append_2synonym(words_list, num_words) 

Oto zawartość '' test2 words.txt pliku:

five kiddiewinks|five kids|five children 
mobile phone|cell phone|cellular phone 
stinky cheese|smelly cheese 

Oto pełna błąd otrzymuję:

Traceback (most recent call last): 
    File "D:\Magic Briefcase\My Python Scripts\Spin Scripts\synonyms\testing2.py", line 16, in <module> 
    append_2synonym(words_list, num_words) 
    File "D:\Magic Briefcase\My Python Scripts\Spin Scripts\synonyms\testing2.py", line 12, in append_2synonym 
    f.write("\n" + num_words) 
IOError: [Errno 0] Error 
[Finished in 0.1s with exit code 1] 

Każda pomoc doceniona Pozdrowienia Darren

+0

Wygląda podobnie do http://stackoverflow.com/questions/11176724/python-file-operations, czy jesteś w systemie Windows? –

+0

Tak, używam Windows 7 –

Odpowiedz

7

Cytując odpowiedź od Python file operations, podczas przełączania między czytaniem a pisaniem w systemie Windows, musi być wykonywana pośrednia operacja fflush, fsetpos, fseek lub rewind.

Oto możliwe fix:

import re 

num_words = "four kiddiewinks|four children|four kids" 
words_list = num_words.split('|') 

def append_2synonym(words_list, num_words): 
    with open('test2 words.txt', 'a+') as f: 
     read_f = f.read() 
     patt = r'^' + words_list[0] + '\|' 
     result = re.search(patt, read_f, re.MULTILINE) 
     if result == None: 
      f.seek(0,2) # change is here !! 
      f.write("\n" + num_words) 
     else: 
      print "\nNo match found in '2 words.txt' file" 

append_2synonym(words_list, num_words) 

W f.seek(0,2), 2 jest from_what argumentem. Wartość mierzy od początku pliku, 1 wykorzystuje bieżącą pozycję pliku, a 2 używa końca pliku jako punktu odniesienia. from_what można pominąć i przyjmuje wartość domyślną 0, wykorzystując początek pliku jako punkt odniesienia.

+0

Ponieważ 'f.read()' czyta do EOF, oryginał * powinien * działać: standard C umożliwia przełączanie z trybu odczytu na zapis, jeśli odczyt napotka EOF. Jeśli to naprawi, oznacza to, że biblioteka C jest włączona (niektóre kompilatory i/lub niektóre wersje?) Windows robi to źle. – torek

+0

@btoueg - dziękuję, że to działa. Próbowałem go kilka razy i apeending kontynuuje pracę i rozwija plik "test2 words.txt". Po prostu próbowałem spojrzeć na dokumenty Pythona na temat '.seek()', ale nie mogłem całkowicie wykombinować 'f.seek (0,2)'. Rozumiem, że pierwszy argument "0" skutecznie przewija do początku pliku, ale co robi '2'? –

+1

Edytowałem odpowiedź. Aby uzyskać więcej informacji, sprawdź odpowiedź, o której mówię. –