Форум сайта python.su
Здравствуйте.
Есть задача:
Написать скрипт для формирования файла а-ля файл хостс:
#! 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()
-|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
Офлайн
UsCrПравда, shebang-строку видна игнорирует. Только никсы читают первые 2 байта, чтобы понять чем выполнять файл.rootkidТы ведь не под никсами пытаешься “C:\Users\Alexandr\workspace\acad_dev\src\file.py” найти, правда?#! usr/bin/env Python26
Офлайн
А где пост UsCr?
Офлайн
Понятия не имею…UsCr, наверное, понял, что написал “неправду” и ретировался, заметая следы:)
Вы мне не поможете, с решением проблемы?)
Вопрос “где пост UsCr?” не главный вопрос этого топика ;)
Офлайн
Хм, странно, здесь вроде бы нельзя удалить свой пост без следов…
А по поводу кода - файл открыт на чтение, а попытка записи.
Офлайн
Ну, вот у меня у моих постов есть кнопка “Удалить”:)
По поводу кода: нет, файл открыт не на чтение, а на чтение + запись. Режим “r+”
Тут про функцию open() и про режимы: http://docs.python.org/library/functions.html#open
Офлайн
Боже, ну Я и баран:))) Кинул вам ссылку на режимы, а там написано “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
...
Офлайн
FerromanМожно. Я сначала написал, а потом подумал, что если ругается на “C:\Users\Alexandr\workspace\acad_dev\src\file.py”, то код исполняют под виндой. Да и вообще, C:\Users\Alexandr\workspace\acad_dev\src\file.py тут не при чём в принципе.
Хм, странно, здесь вроде бы нельзя удалить свой пост без следов…
Офлайн