将值从csv文件传递到python类

时间:2018-06-19 20:49:42

标签: python python-3.x csv class

class Devices:

    def __init__(self, fqdn):
        self.fqdn = fqdn

    def domain(self, fqdn):
        self.fqdn = fqdn.split(".")
        if fqdn.split(".")[1] == 'sa':
            return 'South America'
        elif fqdn.split(".")[1] == 'na':
            return 'North America'
        elif fqdn.split(".")[1] == 'ap':
            return 'Asia Pacific'
        elif fqdn.split(".")[1] == 'ea':
            return "Europe"


device_1 = Devices('retuyr.sa.abc.com')
device_2 = Devices('agtrah.na.abc.com')
domain1 = Devices('retuyr.sa.abc.com')
domain2 = Devices('agtrah.na.abc.com')

print('FQDN: %s' % device_1.fqdn)
print('Region is: %s' % domain1.domain(fqdn='retuyr.sa.abc.com'))
print('FQDN: %s' % device_2.fqdn)
print('Region is: %s' % domain2.domain(fqdn='agtrah.na.abc.com'))

我知道可能还有其他方法可以在这里找到该区域,而不必进行“拆分”。但是,我还有其他一些功能可以在子类中运行,因此需要保持这种方式。

,这里的输出是:

FQDN: retuyr.sa.abc.com
Region is: South America
FQDN: agtrah.na.abc.com
Region is: North America

现在,我能够做到这一点。但是,我想要的是从csv文件中读取具有FQDN名称的特定列,并遍历该文件中的所有名称。 csv文件中包含许多列,这是一个非常大的文件。我将如何解析此类中的那些值。请帮忙!

编辑:

我的CSV如下:

Server, FQDN, IP_Address, Name, primary1, Address
abc1, retuyr.sa.abc.com, 10.10.10.1, someinfo, someaddress
abc1, agtrah.na.abc.com, 10.10.10.2, someinfo, someaddress
xyz2, somemorefqdns, 10.10.10.3, someinfo, someaddress
...
...

这是一个很大的csv文件。但是我在这里担心的是,仅根据我的FOR循环条件获取FQDN并获取所需的区域。我想要的输出将保持不变。唯一的区别是,我不想手动输入所有这些FQDN名称。只希望他们从csv文件中读取它。

1 个答案:

答案 0 :(得分:2)

使用MooingRawr的pandas中建议的post referenced是一种解决方案,另一种方法是仅使用内置的csv.DictReader

此外,用一个属性值初始化一个类实例,只是立即用您实际想要的值覆盖它,似乎会适得其反。我也不认为彻底改变该属性的类型是一种好习惯。如果初始属性值无关紧要,则可以将该方法保留为类方法。

此外,我发现查找字典比长的if语句更简洁,更易于维护。

import csv

DOMAINLOOKUP = {
    'sa': 'South America',
    'na': 'North America',
    'ap': 'Asia Pacific',
    'ea': "Europe",
}

class Devices():
    def __init__(self,fqdn):
        self.fqdn = fqdn

    @property
    def fqdnparts(self):
        """ Returns the fqdn split into its individual components (dot delineated) """
        ## In your original code, calling domain replaced the self.fqdn
        ## string with a list, thus making it impossible to predict the type
        ## of fqdn on any given object, so I created a new attribute to
        ## interface with the split value
        return self.fqdn.split(".")

    @property
    def domain(self):
        code = self.fqdnparts[1]
        return DOMAINLOOKUP[code]

def initializefile(file):
    with open(file) as f:
        return convertrows(csv.DictReader(f))

def convertrows(rows):
    return [Devices(row['FQDN']) for row in rows]

file = r"My\file.csv"
devices = initializefile(file)

for device in devices:
    print(f"FDQN: {device.fqdn}, Region: {device.domain}")
## Prints
## > "FDQN: retuyr.sa.abc.com, Region: South America"
## > "FDQN: agtrah.na.abc.com, Region: North America"