Найти - Пользователи
Полная версия: Ошибка при записи в файл
Начало » Python для новичков » Ошибка при записи в файл
1
rootkid
Здравствуйте.
Есть задача:
Написать скрипт для формирования файла а-ля файл хостс:
#! usr/bin/env Python26
#-*-coding: UTF-8-*-
import os
try:
fileHosts=open(os.environ['USERPROFILE']+r"\hosts",'r+')
fileHosts.seek(0) # указатель в начало файла во избежании глюков
tempList=[]
for line in fileHosts.readlines():
tempTuple=tuple(line.split()) # делим прочитанную из файла строку по пробелу, получаем список из 2х строк, кот. далее конвертируем в кортеж
tempList.append(tempTuple) # добавляем новый элемент (кортеж) в список
dictHosts=dict(tempList) # создаём словарь из списка кортежей
fileHosts.close()
print '-|%s|%s|%s|-' % ('IP','-'*30, 'Hostname'), '\n', '-'*45
for key, value in dictHosts.items():
print '%s %30s' % (key, value)
except IOError:
fileHosts=open(os.environ['USERPROFILE']+r"\hosts",'w')
fileHosts.close()
fileHosts=open(os.environ['USERPROFILE']+r"\hosts",'r+')
fileHosts.seek(0)
entry=raw_input('Please, enter new \'ip_addr hostname\' pair: ')
#entry+='\n'
if fileHosts.read(1)!='':
entry='\n'+entry
fileHosts.writelines(entry)
fileHosts.close()
При первом запуске (при отсутствии файла) , мы заходим в блок exception и создаём файл. В консоль выводится приглашение ко вводу: вводим айпишник и хостнейм, разделённые пробелом (да хоть любые 2 строки, главное, чтобы 2, и чтобы пробелом:)))). Задача проверки ввода на корректность пока не стоит.
Первый раз всё чудесно, выполнение скрипта успешно завершается.
Далее запускаем его снова (файл уже есть, и в нём строка), соотв. заходим в try, он нам выводит содержимое словаря и далее опять ввод. И вот после этого второго ввода запись в файл генерирует исключение, непонятного вида:)
-|IP|------------------------------|Hostname|- 
---------------------------------------------
5.5.5.5 asdfsadf
Please, enter new 'ip_addr hostname' pair: abcdrdfg asdfasdfsadf
Traceback (most recent call last):
File "C:\Users\Alexandr\workspace\acad_dev\src\file.py", line 27, in <module>
fileHosts.writelines(entry)
IOError: [Errno 0] Error
Объясните мне, пожалуйста, где я не прав?
заранее прошу прощения за ?:%-код. Питон начал изучать пару дней назад:)
rootkid
UsCr
rootkid
#! usr/bin/env Python26
Ты ведь не под никсами пытаешься “C:\Users\Alexandr\workspace\acad_dev\src\file.py” найти, правда?
Правда, shebang-строку видна игнорирует. Только никсы читают первые 2 байта, чтобы понять чем выполнять файл.
Скрипт создаёт файл, при втором запуске успешно находит его и пишет туда.
ПРоблемы при третьем запуске, когда скрипт пишет (пытается) в файл второй раз.
Ferroman
А где пост UsCr?
rootkid
Понятия не имею…UsCr, наверное, понял, что написал “неправду” и ретировался, заметая следы:)
Вы мне не поможете, с решением проблемы?)
Вопрос “где пост UsCr?” не главный вопрос этого топика ;)
Ferroman
Хм, странно, здесь вроде бы нельзя удалить свой пост без следов…
А по поводу кода - файл открыт на чтение, а попытка записи.
rootkid
Ну, вот у меня у моих постов есть кнопка “Удалить”:)
По поводу кода: нет, файл открыт не на чтение, а на чтение + запись. Режим “r+”
Тут про функцию open() и про режимы: http://docs.python.org/library/functions.html#open
rootkid
Боже, ну Я и баран:))) Кинул вам ссылку на режимы, а там написано “Modes ‘r+’, ‘w+’ and ‘a+’ open the file for updating (note that ‘w+’ truncates the file)”. Т.е. когда я открываю файл повторно (и там уже есть запись) в режиме r+, я открываю на обновление, но указатель стоит на первый байт (file.seek(0)), и отсюда ошибка, т.к. я пытаюсь перезаписать уже существующие байты, что в режиме r+ делать нельзя, ибо только “w+' truncates the file”.
Может кому пригодится:
...
if fileHosts.read(1)!='':
fileHosts.seek(-1, 2) # проблема решилась установкой указателя в конец файла
entry='\n'+entry
...
UsCr
Ferroman
Хм, странно, здесь вроде бы нельзя удалить свой пост без следов…
Можно. Я сначала написал, а потом подумал, что если ругается на “C:\Users\Alexandr\workspace\acad_dev\src\file.py”, то код исполняют под виндой. Да и вообще, C:\Users\Alexandr\workspace\acad_dev\src\file.py тут не при чём в принципе.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB