附加功能嵌套在IF语句体内不起作用

时间:2015-10-13 21:42:11

标签: python list if-statement append

我是Python的新手(刚刚开始在过去两周内学习)并且我正在尝试编写一个脚本来解析csv文件以将一些字段提取到List中:

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子句之后立即进入我的代码 - 我可以验证“我的csv文件中是否已成功使用Str填充”Switchport“(IF子句中的第一个语句)以及“开关”和“标签”。但是,由于某种原因,“natList”没有附加从我的csv的每一行解析的字段。 Python没有返回任何错误 - 根本不附加“natList”。

这实际上是一个函数(一旦我让代码本身工作),但是现在,我只是将函数参数设置为全局变量,以便能够在iPython控制台中运行它必须调用该函数。

“lbl”,“sw”,“swpt”,“cd”和“pt”指的是我的csv中的列#(完成的函数将允许用户输入这些变量的值)。

我假设我遇到了“natList”范围的某些问题 - 但我尝试将“natList = []”语句移动到我的代码中的各个位置都无济于事。

我可以在控制台中运行上面的命令,然后单独运行“append.natList([Switch,Switchport,Label])”,它出于某种原因运行....?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

似乎while条件需要一个额外的括号。只需以这种方式添加一些while (Site in siteList) == True:或Padraic while Site in siteList:建议的更清洁的方式。

将布尔对象与字符串对象进行比较。

答案 1 :(得分:1)

更改

while Site in siteList == True:

if Site in siteList:

答案 2 :(得分: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将第一行作为字段名,然后返回字典:

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