我是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])”,它出于某种原因运行....?
感谢您的帮助!
答案 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