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 に答える