2013-02-19 10 views
8

Przetwarzam plik z listą ścieżek. Próbuję sprawdzić, czy jedna ścieżka znajduje się w określonym katalogu, czy nie. Mam więc dwa ciągi S1 i S2. Powiedzmy, że są one S1 = '/ tmp /' i S2 = '/tmp/plik.txt'strncmp w pythonu

Jeśli chcę sprawdzić, czy S2 ma S1, a następnie kilka dodatkowych bajtów w C, zrobiłbym strncmp bajtów S1 i S2 upto strlen (S1). Czy jest sposób na to w python? Jestem nowy w Pythonie i nie znam jeszcze wszystkich dostępnych modułów. Mogę to zaimplementować trywialnie, powtarzając tylko znaki w łańcuchach i porównując, ale chcę się dowiedzieć, czy jest coś, co domyślnie daje mi takie funkcje pomocnicze.

Dzięki za pomoc.

P

Odpowiedz

11

Tak. Możesz zrobić: if a in b: To sprawdzi, czy a jest podłańcuchem w dowolnym miejscu w b.

np.

if 'foo' in 'foobar': 
    print True 

if 'foo' in 'barfoo': 
    print True 

Wygląda na to, że chcesz tylko spojrzeć na początek napisów. W tym przypadku można zastosować metodę .startswith:

if 'foobar'.startswith('foo'): 
    print "it does!" 

Podobnie można zrobić to samo z endswith:

if 'foobar'.endswith('bar'): 
    print "Yes sir :)" 

wreszcie może przekład najbardziej dosłownym strncmp byłoby użyć krojenia i ==:

if a[:n] == b[:n]: 
    print 'strncmp success!' 

Python posiada również wiele udogodnień dla czynienia z nazw ścieżek wModuł. Warto zbadać, co tam jest. Jest kilka całkiem fajnych funkcji.

+0

Yours jest prawdopodobnie bardziej pythonic, ale myślę, że krojenie należy również rozważyć. +1 – 0xC0000022L

+1

Wow. To jest dokładnie to, co miałem nadzieję, że python ma. Powiedziano mi, że Python jest niesamowity i do tej pory nie był rozczarowany. – R11

+0

@ R11 - Python ma kilka qwirków, które na początku prawie wszystkich wyzwalają, ale gdy już to wymyślisz, praca z nimi jest naprawdę przyjemnością. Powodzenia! – mgilson

2

Prawdopodobnie szukasz os.path.commonprefix.

na przykład: os.path.commonprefix(['/tmp/','/tmp/file.txt']) powróci '/tmp/

więc należy sprawdzić len(os.path.commonprefix([s1,s2])) > 0

Odjazd docs tutaj: http://docs.python.org/2/library/os.path.html

+0

To interesujące podejście do problemu. +1 za myślenie nieszablonowe. – mgilson

+0

Nice! Też bardzo mi się podoba. Czy obsługuje również oznaczenia specyficzne dla systemu operacyjnego, takie jak ścieżki systemu Windows zaczynające się od "C: \\ tmp \" zamiast "/ tmp /"? Nie miałem tego w ogóle w ogóle, kiedy pisałem. Miałem tylko nadzieję, że znajdę jakieś sztuczki maniakowania ciągami. Ale niesamowite! – R11

+0

Szczerze mówiąc nie jestem pewien, jak to działa z oknami i nie mam okna z okienkiem, aby sprawdzić siebie, ale zgaduję, że nie. Wydaje się, że jest to dokładniejszy sposób sprawdzenia, czy ścieżka jest ścieżką podrzędną. Właśnie zauważyłem, że robiłeś manipulację ścieżką, której C może nie mieć wyspecjalizowanego modułu, ale python ma 'os.path'. Wielu programistów przybywa do pythonów z innych środowisk i wymyśla te funkcje (zwykle w przenośny sposób), więc uznałem, że dobrym pomysłem jest zaprezentowanie standardowej biblioteki. Pamiętaj, python jest dostarczany z bateriami: D – rgrinberg

0

można wykorzystać metodę find z ciągiem

>>> s1 = "/tmp" 
>>> s2 = "/tmp/file.txt" 
>>> s2.find(s1) 
0 
1

Możesz to przetestować pod numerem

S2[:len(S1)] == S1 

albo jeszcze prościej:

S2.startswith(S1) 
Powiązane problemy