2012-12-31 2 views
0

저는 파이썬의 문자열 처리에 비교적 익숙하며 문제를 해결하는 데 어려움이 있습니다. 나는 /dir/MAC.timestamp.bin 행을 따라 절대 경로를 가지고 있습니다. '같은 뭔가를 통해 반복 M :문자열 : 마지막부터 여섯 번째 문자를 먼저 추출하십시오/

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

을 그리고 내가 지금 필요한, (6 자로 제공)를 MAC를 추출하는 것입니다. 나는

for fh in glob.glob("bin/*.bin"): 
    list=fh.split("/") 
    lstlen=len(list) 
    mac=list[lstlen-1][:6] 
    retval = database.postdata(mac,fh) 

의 라인을 따라 뭔가를하고 생각하고 있었는데 그게 항상 꽉 공기를 될 것입니다 경우 100 % 확실하지 않다과이 처리하는 더 좋은 방법이 있다면? 힌트를 보내 주시면 감사하겠습니다.

감사합니다.

답변

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

그래야합니다.

파이썬리스트는 음수를 갖는 인덱스 일 수 있습니다. -1은 목록의 마지막 요소입니다.

들어오는 데이터가 귀하의 사양을 준수하지 않는 경우 귀하의 질문에 나와있는 바와 같이 내 솔루션 및 귀하의 정보가 긴장되지 않을 것입니다. 당신은 다음과 같은 체크에 추가해야합니다 그것을 위해이 검사는 또한 귀하의 경우에 유효하지 않은 mac을 생산하는 문자를 포함하지 않는 것을 확인에서 도움이 될

>>> 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 

.

+1

'[0 : 6]이 '와 같은 출력을 얻을 수있을 때'상세 표시 [6]' – theharshest

0

os.path에는 도움이 될만한 기능이 있습니다. 특히, os.path.basenameos.path.splitext. 어쩌면이 시도 : 당신은 p.split('/')[-1] 대신 os.path.basename(p)를 사용해야합니다

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,))) 
2

. 예를 들어

:

>>> 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' 
+0

이유 선호하는 대 basename() 대 split()? – cerr

관련 문제