【问题标题】:Append Function Nested Inside IF Statement Body Not Working嵌套在 IF 语句主体内的附加函数不起作用
【发布时间】:2016-01-11 19:43:16
【问题描述】:

我对 Python 还很陌生(最近两周才开始学习),我正在尝试编写一个脚本来解析一个 csv 文件以将一些字段提取到一个列表中:

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

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

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

我假设我在“natList”范围内遇到了一些问题——但我尝试将“natList = []”语句移动到我的代码中的不同位置,但无济于事。

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

感谢您的帮助!

【问题讨论】:

  • 只是一个建议.. 您可能应该在您的帖子中添加一个 python 标签,以便人们更有可能看到它。我通常只是浏览包含特定标签的帖子。可悲的是,我对 python 几乎一无所知——但。希望你能找到答案。
  • 谢谢!这个网站的新手......
  • 我也没有问题 - 如果他们认为您没有正确发布,会有很多人告诉您如何发布 :) 将其视为帮助。有时他们也可以很直率。不要读太多。顺便说一句,在这里试试 .. stackoverflow.com/help ;-)

标签: python list if-statement append


【解决方案1】:

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

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

【讨论】:

  • 顺便说一句,我会在 if 子句中更改它。因为它会无限期地执行那个循环
  • 好收获。现在,当我运行它时,它会暂时锁定我的计算机,然后给我一个内存错误。
  • 我明白了!感谢您的协助 inulinmux12。我不得不像你说的那样在“站点列表中的站点”语句周围添加括号,并将“while”循环更改为“if”语句,现在它可以工作了。
  • while Site in siteList: 是正确的方法。
  • 如果回答对您有帮助,请标记为正确:)
【解决方案2】:

改变

while Site in siteList == True:

if Site in siteList:

【讨论】:

    【解决方案3】:

    您可能想查看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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2017-03-24
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      相关资源
      最近更新 更多