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文件中读取它。
答案 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"