string:在最后一个之后提取前六个字符/

时间:2012-12-31 18:02:35

标签: python string extract

我对Python的字符串处理相对较新,并且弄清楚如何解决这个问题:我有/dir/MAC.timestamp.bin的绝对路径,我正在使用类似的东西循环:

for fh in glob.glob(DATA_FOLDER+"*.bin"):
    retval = database.postdata(fh)

而我现在需要的是提取MAC(以6个字符组成)。 我正在考虑按照

的方式做一些事情
for fh in glob.glob("bin/*.bin"):
    list=fh.split("/")
    lstlen=len(list)
    mac=list[lstlen-1][:6]
    retval = database.postdata(mac,fh)
然而,我不是百分之百确定这是否会在任何时候都是气密的,如果有更好的方法来解决这个问题? 任何提示都表示赞赏!

谢谢!

3 个答案:

答案 0 :(得分:2)

您应该使用os.path.basename(p)代替p.split('/')[-1]

例如:

>>> import os
>>> p = '/dir/MAC.timestamp.bin'
>>> p = os.path.basename(p)
>>> p
'MAC.timestamp.bin'
>>> p[:3]
'MAC'

更通用的解决方案:

>>> import os
>>> p = '/dir/MAC.timestamp.bin'
>>> p = os.path.basename(p)
>>> p.split('.')[0]
'MAC'

答案 1 :(得分:1)

>>> s = "this/is/a/test23.123456789.bin"
>>> s.split( "/" )[-1][:6]
'test23'

这应该有效。

Python列表可以是带负数的索引。 -1是列表中的最后一个元素。

同样,如果您的问题表明我的解决方案,那么如果传入的数据不符合您的规格,那么您的解决方案将不会紧密。您需要添加一个支票,如下所示:

>>> s = "this/is/a/test23.123456789.bin"
>>> last_part = s.split( "/" )[-1].split( "." )
>>> if len( last_part ) != 6:
...  print "Improper file format"
>>> else:
...  print "Correct: %s" % last_format

检查它是否也会受益于检查它是否包含在您的案例中产生无效mac的字符。

答案 2 :(得分:0)

os.path具有您会发现有用的功能。特别是os.path.basenameos.path.splitext。也许试试这个:

import os.path

for fh in glob.glob("bin/*.bin"):
    filename = os.path.basename(fh)
    mac = os.path.splitext(filename)[0]
    if len(mac) != 6:
        raise(Exception('MAC %r is not six characters long' % (filename,)))