2015-03-01 3 views
1

Я пытаюсь создать скрипт, который добавит зону в конец named.conf, если домен не существует (последнее вхождение маркера # - # и запись в следующую строку) , Я, кажется, попался в парадокс списка против файлового объекта. Если я открою список, я могу найти свою строку, но не могу записать файл без закрытия объекта списка, что не является хорошим решением. Если открыть файл как объект файла, я получаю сообщение об ошибке объект пытается использовать найтиPython3 найти последнюю строку вхождения, а затем написать

Traceback (most recent call last): 
    File "named.py", line 10, in <module> 
    answer = mylist.find('#--#') 
AttributeError: 'list' object has no attribute 'find' 

или

File "named.py", line 12, in <module> 
    f.write(" zone \""+name+"\" {\n") 
io.UnsupportedOperation: not writable 

Что такое правильный способ, чтобы открыть файл для поиска и редактирования в Python3 ?

import sys 
import string 
import os.path 

name = input("Enter the domain to configure zone for? ") 
#fd = open("named.conf", 'w') 
if os.path.lexists("named.conf"): 
     with open('named.conf') as f: 
       mylist = list(f) 
       print(mylist) 
       f.write("  zone \""+name+"\" {\n") 
+0

Так что проблема именно вы видите с кодом? Это выглядит правильно для меня. Также обратите внимание, что нет такой вещи, как «закрытие объекта списка» или «открытие файла в виде списка»; то, что вы здесь делаете, открывает файл и читает его содержимое в списке. Список не нужно закрывать. – yole

+0

код отсутствует. Где 'answer = mylist.find ('# - #')' в программе? –

+0

вам сначала нужно открыть для написания и чтения, но даже тогда у вас будут проблемы. где вы проверяете, существует ли домен? –

ответ

1

Файл открыт только для чтения, так что именно поэтому вы получите сообщение об ошибке, используете ли вы in или == зависит от того, может ли строка содержит имя домена или линия должна быть равна имени домена ,

if os.path.lexists("named.conf"): 
    with open('named.conf') as f: 
     found = False 
     for line in f: 
      # if domain is in the line break and end 
      if name in line.rstrip(): 
       found = True 
       break 
    # if found is still False we did not find the domain 
    # so open the file and append the domain name 
    if not found: 
     with open('named.conf', "a") as f: 
      f.write("  zone \{}\ {\n".format(name)) 

Чтобы найти последнее вхождение строки и записать строку после:

if os.path.lexists("named.conf"): 
     with open('named.conf') as f: 
      position = -1 
      for ind, line in enumerate(f): 
       # if line is #--# 
       if "#--#" == line.rstrip(): 
        # keep updating index so will point to last occurrence at the end 
        position = ind 
     if position != -1: # if we found at least one match 
      with open('named.conf', "r+") as f: 
       for ind, line in enumerate(f): 
        if ind == position: # find same line again 
         # write line and new line 
         f.write("{}{}\n".format(line,your_new_line)) 
        else: 
         f.write(line) 
+0

Я придерживаюсь того, как искать и писать в том же экземпляре. В строке 10, если мне нужно записать в определенное место в файле, например «после последнего вхождения строки # - # (мне нужен маркер файла для обновления динамического файла.) – mine

+0

использовать перечисление, получить индекс , снова запишите строку с индексом + то, что вы хотите вставить. Новая строка будет убедиться, что она написана в следующей строке –

+0

. Можете ли вы обновить свой ответ, чтобы отразить? – mine

Смежные вопросы