如何获取两个数字之间的值,这两个数字是一个字符串,由“分隔”-&引用;python中的符号?

如何获取两个数字之间的值,这两个数字是一个字符串,由“分隔”-&引用;python中的符号?,python,python-3.x,Python,Python 3.x,因此,我试图解决的问题是将所有端口号从0到65535进行分类。我得到了一种几乎能解决问题的材料。 我有一个csv文件(coma分离),它有两列,其中一列是端口号,另一列是其服务名称(分类)。在端口号的某些列中,我有一个范围,即“100-200”,它是一个字符串 例如:- 现在在原始2和11中有一个范围。ie 272至279和288至307。 如何将其转换为端口号并映射到相同的服务名称。 结果应该是这样的 服务名称端口号 pt-tls 271 Unassigned

因此,我试图解决的问题是将所有端口号从0到65535进行分类。我得到了一种几乎能解决问题的材料。 我有一个csv文件(coma分离),它有两列,其中一列是端口号,另一列是其服务名称(分类)。在端口号的某些列中,我有一个范围,即“100-200”,它是一个字符串

例如:-

现在在原始2和11中有一个范围。ie 272至279和288至307。
如何将其转换为端口号并映射到相同的服务名称。 结果应该是这样的

服务名称端口号

pt-tls              271
Unassigned          272
Unassigned          273
Unassigned          274
Unassigned          275
Unassigned          276
Unassigned          277
我试过了 t=[]

上面的代码需要很多时间。 有什么优雅的方法可以解决这个问题吗


如果有任何材料已经映射了端口,请包含在您的答案中。

鉴于您已经编写的代码,我怀疑是否有办法使其更快。但是我认为在健壮性和无bug方面有一些可能的改进

您的示例文件是一个选项卡分隔的
StringIO
,以使测试更容易:

从io导入StringIO
数据=字符串(“”)\
服务名称、端口号
pt tls,271
pt tls,271
未分配,272-279
http管理,280
http管理,280
个人链接,281
个人链接,281
cableport ax,282
cableport ax,282
rescap,283
rescap,283
科雷杰德,284
科雷杰德,284
未分配,285
fxp,286
fxp,286
k座,287
k座,287
未分配,288-307
诺瓦斯托巴克杯,308
诺瓦斯托巴克杯,308
""")
我将循环作为生成器而不是聚合器编写,因为在范围不断扩展的环境中使用它更容易:

导入csv
def扩展_端口(文件,delim=','):
handle=csv.reader(文件,分隔符=delim)
下一步产量(手柄)#跳过收割台
对于句柄中的行:
尝试:
服务名称,端口号=行
除值错误外:
打印(f“无法分析行“{row}”)
提升
如果端口号中没有“-”:
产生[服务名称、端口号]#简单结果
其他:
开始,结束=映射(int,端口号。拆分('-'))
对于映射中的端口(str,范围(开始,结束+1)):
产生[服务名称,端口]#扩展结果
#得到结果
结果=列表(扩展端口(数据))
#你的电话应该是
#结果=列表(扩展端口(打开('my\u config.csv'))
#打印出来
对于行输入结果:
打印(行)
它将打印所需的格式:

['Service Name', 'Port Number']
['pt-tls', '271']
['pt-tls', '271']
['Unassigned', '272']
['Unassigned', '273']
['Unassigned', '274']
['Unassigned', '275']
['Unassigned', '276']
['Unassigned', '277']
...
['Unassigned', '306']
['Unassigned', '307']
['novastorbakcup', '308']
['novastorbakcup', '308']
如果您对结果感到满意,可以使用与读取该结果相同的
csv
模块将其写回文件:

将open('my_extended_config.csv','w')作为f:
writer=csv.writer(f,分隔符='\t')
writer.writerows(结果)

您尝试过熊猫吗?您建议您的输入是.csv,但您提供的示例数据表明您的输入是以制表符分隔的?示例中的服务名称包括行号,这是有意的还是仅仅为了示例?输入文件中的端口号是否总是连续的,或者您是否希望存在间隙?如果是,您希望这些间隙如何显示在输出中?另外,为什么要分散范围,但仍保留重复的条目?具体目标是什么?第十一个条目应该是
4-http-mgmt 280
还是
11-http-mgmt 280
?@Grismar 1)它实际上是一个coma分离的文件,我从csv文件复制粘贴了它。@2)行号只是示例3)是连续的端口号,所以当“272-279”映射为“Unassigned”应位于映射到“Unassigned”的连续行中“.4)副本属于同一类别,我们将从中仅取一份。谢谢您的支持time@Arne这只是一个输入错误,我将对其进行编辑。csv文件实际上是一个coma分隔格式,我尝试了将分隔符更改为coma分隔的代码,并进行了一些其他调整,结果是“result=list(extend_ports(data))”出现了错误“ValueError:没有足够的值来解包(预期为2,得到1)”。感谢您的时间我将代码更改为逗号分隔,它与我拥有的测试数据一起工作。我还添加了一条调试消息,以防出现异常,您可以在那里看到当再次发生类似错误时您自己如何处理。映射所有端口,谢谢。
for i in range(data["Port Number"].shape[0]):
    #print(i)
    t.append(str(data["Port Number"][i]).split("-"))
    for p in t:
        if len(p)>1:
            t.append(range(int(p[0]),int(p[1])))
            print(range(int(p[0]),int(p[1])))
            #t.append(range())
        else: t.append(p)
['Service Name', 'Port Number']
['pt-tls', '271']
['pt-tls', '271']
['Unassigned', '272']
['Unassigned', '273']
['Unassigned', '274']
['Unassigned', '275']
['Unassigned', '276']
['Unassigned', '277']
...
['Unassigned', '306']
['Unassigned', '307']
['novastorbakcup', '308']
['novastorbakcup', '308']