0

我对 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)

但是,我不能 100% 确定这是否会始终保持密封,以及是否有更好的方法来处理这个问题?任何提示表示赞赏!

谢谢!

4

3 回答 3

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'
于 2012-12-31T18:14:06.247 回答
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在您的情况下产生无效的字符。

于 2012-12-31T18:04:36.740 回答
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,)))
于 2012-12-31T18:13:57.903 回答