2014-12-12 2 views
0

Я разбираю некоторые текстовые файлы (файлы с версией Cisco switch show) со следующим скриптом. Он отлично работает, за исключением того, что только один раз выводит «серийный номер» & «модель», и есть более одной строки с этой информацией. Как я могу заставить скрипт продолжать анализировать весь файл?python для завершения цикла до конца файла

import os 
import csv 

inventoryfile = open('inventory.csv', 'a') 
write_inventory = csv.writer(inventoryfile) 
#write_inventory.writerow(('Hostname', 'Model', 'Serial Number')) 

def parse_files(path): 
    for filename in os.listdir(path): 
     with open(os.path.join(path,filename),'r') as showfile: 
       for line in showfile: 
#     i = 0 
#     while i < 4: 
         if '#sh' in line: 
          hostname = line.split('#')[0] 
         if 'Model number' in line: 
          model = line.split()[-1] 
         if 'System serial number' in line: 
          serial = line.split()[-1] 
         elif 'Model Number' in line: 
          model = line.split()[-1] 
         elif 'System Serial Number' in line: 
          serial = line.split()[-1] 
#      i += 1 
       write_inventory.writerow((hostname, model, serial)) 


directory = raw_input("Please specify Show Files directory: ") 

parse_files(directory) 
+0

Ваша write_inventory линия не внутри для цикла, он будет работать только один раз для каждого файла. –

+0

@TonyBlundell, если я помещаю его в цикл for, я получаю эту ошибку: 'UnboundLocalError: локальная переменная 'hostname', на которую ссылается перед присваиванием, и именно поэтому она есть. – bordeltabernacle

+0

Эта ошибка правильная, вы получаете доступ к имени хоста, но назначаете ее только в том случае, если в строке находится #sh. –

ответ

1

Как вы знаете, что это только набирает эти линии один раз? У вас есть только один серийный номер для их хранения. Каждый раз, когда он находит соответствующую строку, он переписывает эту переменную с последним значением.

Если вы хотите записать все экземпляры этих строк, вы должны сохранить их в списке.

+0

А, интересно, я не проверял, но на самом деле записывает последнее появление строки в файл. Спасибо, я посмотрю, как записать результаты в список. – bordeltabernacle

2

Вы пишете один раз за один файл, а не один раз в строке, поэтому он будет писать только последнюю строку. Поместите write_inventory в цикл

+0

, если я помещаю его в цикл for, я получаю эту ошибку: 'UnboundLocalError: локальная переменная 'hostname', на которую ссылаются перед присваиванием' Как мне получить ее внутри цикла for без получения этой ошибки? – bordeltabernacle

+0

Это потому, что в строке не было '#sh', поэтому вы должны инициализировать переменную в каждом цикле, иначе вы можете получить разные результаты, чем ожидалось, например, иметь имя хоста из предыдущей строки – Xacosta

+0

ok, поэтому из-за этого 'hostname = line.split ('#') [0]' Я не инициализирую переменную, как если бы я делал это: 'hostname = foo'? Как назначить значение из строки И инициализировать переменную? Очевидно, я новичок и просто пытаюсь обойти это. – bordeltabernacle

0

Если вы не понимаете, что они сказали, попробуйте этот код:

import os 
import csv 

inventoryfile = open('inventory.csv', 'a') 
write_inventory = csv.writer(inventoryfile) 
#write_inventory.writerow(('Hostname', 'Model', 'Serial Number')) 

def parse_files(path): 
    for filename in os.listdir(path): 
     with open(os.path.join(path,filename),'r') as showfile: 
       for line in showfile: 
#     i = 0 
#     while i < 4: 
         hostname = model = serial = '' 
         if '#sh' in line: 
          hostname = line.split('#')[0] 
         if 'Model number' in line: 
          model = line.split()[-1] 
         if 'System serial number' in line: 
          serial = line.split()[-1] 
         elif 'Model Number' in line: 
          model = line.split()[-1] 
         elif 'System Serial Number' in line: 
          serial = line.split()[-1] 
#      i += 1 
         write_inventory.writerow((hostname, model, serial)) 


directory = raw_input("Please specify Show Files directory: ") 

parse_files(directory) 
+0

это пишет загрузку запятой в файл? – bordeltabernacle

+0

Я имею в виду, что вы должны сначала определить переменные. Если вы не хотите писать запятые, просто пропустите их. Я думаю, что если вы вставляете содержимое ваших файлов, другие будут знать, какой код вам действительно нужен. – tianwei