2015-10-13 3 views
3

Я довольно новичок в Python (только что начал учиться за последние две недели) и пытаюсь написать скрипт для синтаксического анализа файла csv, чтобы извлечь некоторые из полей в список:Append Function Вложенная внутренняя строка оператора IF не работает

from string import Template 
import csv 
import string 

site1 = 'D1' 
site2 = 'D2' 
site3 = 'D5' 
site4 = 'K0' 
site5 = 'K1' 
site6 = 'K2' 
site7 = '0' 
site8 = '0' 
site9 = '0' 
lbl = 1 
portField = 'y' 
sw = 5 
swpt = 6 
cd = 0 
pt = 0 
natList = [] 
with open(name=r'C:\Users\dtruman\Documents\PROJECTS\SCRIPTING - NATAERO DEPLOYER\NATAERO DEPLOYER V1\nataero_deploy.csv') as rcvr: 
    for line in rcvr: 
     fields = line.split(',') 
     Site = fields[0] 
     siteList = [site1,site2,site3,site4,site5,site6,site7,site8,site9] 
     while Site in siteList == True: 
      Label = fields[lbl] 
      Switch = fields[sw] 
      if portField == 'y': 
       Switchport = fields[swpt] 
       natList.append([Switch,Switchport,Label]) 
      else: 
       Card = fields[cd] 
       Port = fields[pt] 
       natList.append([Switch,Card,Port,Label]) 
print natList 

Даже если я раздеться заявление ELSE прочь и ворваться в мой код сразу после IF clause-- я могу проверить, что «порта коммутатора» (первое заявление в пункте IF) успешно заселяется с ул из моего csv, а также «Switch» и «Label». Тем не менее, «natList» не добавляется с полями, проанализированными из каждой строки моего csv по какой-то причине. Python не возвращает никаких ошибок - просто не добавляет «natList» вообще.

Это будет функция (как только я получу сам код для работы), но пока я просто устанавливаю параметры функции как глобальные переменные, чтобы иметь возможность запускать ее в консоли iPython без необходимости вызова функции.

«lbl», «sw», «swpt», «cd» и «pt» относятся к столбцу # в моем csv (законченная функция позволит пользователю вводить значения для этих переменных).

Я предполагаю, что у меня проблема с областью «natList», но я попытался переместить оператор «natList = []» в разные места в моем коде безрезультатно.

Я могу запустить выше в консоли, а затем запустить «append.natList ([Switch, Switchport, Label])« отдельно, и это работает по какой-то причине ....?

Спасибо за любую помощь!

+1

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

+0

Спасибо! Новое на этом сайте .... – riddleOFst33l

+0

не проблема меня тоже - будет много людей, рассказывающих вам, как публиковать, если они не думают, что вы сделали это правильно :) Подумайте об этом как о помощи. Иногда они могут быть довольно тупыми. Не читайте слишком много. Попробуйте здесь btw .. http://stackoverflow.com/help ;-) –

ответ

1

Кажется, что условию while требуется дополнительная скобка. Просто добавьте немного таким образом while (Site in siteList) == True: или гораздо более чистый способ, предложенный Padraic while Site in siteList:.

Было сравнение булевого объекта с строковым объектом.

+1

BTW, я бы изменил это, пока для if-clause. Потому что он будет выполнять этот цикл неопределенно – ssierral

+0

Хороший улов. Теперь, когда я запускаю его, он мгновенно блокирует мой компьютер, а затем дает мне ошибку памяти. – riddleOFst33l

+0

Я понял! Спасибо за помощь inulinmux12.Я должен был добавить круглые скобки вокруг оператора «Site in sitelist», как вы сказали, и изменил цикл «while» в «if», и теперь он работает. – riddleOFst33l

1

Вы можете посмотреть в csv модуль, как этот модуль пытается сделать чтение и запись файлов CSV проще, например:

import csv 

with open('<file>') as fp: 
    ... 
    reader = csv.reader(fp) 
    if portfield == 'y': 
     natlist = [[row[i] for i in [sw, swpt, lbl]] for row in fp if row[0] in sitelist] 
    else: 
     natlist = [[row[i] for i in [sw, cd, pt, lbl]] for row in fp if row[0] in sitelist] 

print natlist 

Или, альтернативно, используя csv.DictReader, который занимает первую строку как th e, а затем возвращает словари:

import csv 

with open('<file>') as fp: 
    ... 
    reader = csv.DictReader(fp) 
    if portfield == 'y': 
     fields = ['Switch', 'card/port', 'Label'] 
    else: 
     fields = ['Switch', '??', '??', 'Label'] 
    natlist = [[row[f] for f in fields] for row in fp if row['Building/Site'] in sitelist] 

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