2013-02-08 10 views
11

Tworzę skrypt w języku Python, który będzie uzyskiwał dostęp do każdej linii z pliku tekstowego (np. Pliku.txt), a następnie wyszukaj odpowiedni plik ".py" i ".txt" w katalogu systemowym. Na przykład, jeśli "COPY" (pierwsza linia) jest dostępna z "File.txt", wówczas wyszukiwanie zostanie wykonane dla "COPY.py" i "COPY.txt". Jeśli oba pliki zostaną znalezione, ich data modyfikacji zostanie porównana. Kod nie zawiera błędu składni, ale otrzymuję nieprawidłowy wynik.Jak porównać zmodyfikowaną datę dwóch plików w pythonie?

kod Mój Python jest:

for line in fileinput.input(r'D:\Python_Programs\File.txt'): 
    line = line[0:-1] 
    sc = ''.join((line,'.py')) 
    lo = ''.join((line,'.txt')) 
    for root, dirs, files in os.walk(r'D:\txt and py'): 
     if sc in files: 
      pytime = time.ctime(os.path.getmtime(os.path.join(root, sc))) 
      print(sc, ' :', pytime) 
      for root, dirs, files in os.walk(root): 
       if txt in files: 
        txttime = time.ctime(os.path.getmtime(os.path.join(root, txt))) 
        print(txt, ' :', txttime) 
        if (txttime > pytime): 
         print('PASS', '\n') 
        else: 
         print('FAIL', '\n') 

wyjściowa:

COPY.py  : Mon Aug 27 10:50:06 2012 
COPY.txt : Mon Feb 04 11:05:31 2013 
PASS  #Expected = PASS 

COPY2.py : Fri Feb 08 16:34:43 2013 
COPY2.txt : Sat Sep 22 14:19:32 2012 
PASS  #Expected = FAIL 

COPY3.py : Fri Feb 08 16:34:53 2013 
COPY3.txt : Mon Sep 24 00:50:07 2012 
PASS  #Expected = FAIL 

nie otrzymuję dlaczego "COPY2" i "COPY3" dają "pass". Być może robię to w niewłaściwy sposób. Podobnie jak przy zmianie porównania jako "if (txttime < pytime)" w kodzie. Wszystkie wyniki są wyświetlane jako "FAIL" na wyjściu.

+0

Zamiast surowych struny do okien ścieżek, zamiast po prostu użyć ukośniki - będzie działać dobrze (i będzie również działać na innych platformach). –

+0

można użyć ["os.stat (nazwa pliku) .st_mtime"] (http://docs.python.org/2/library/stat.html#stat.ST_MTIME) tutaj, zwraca ostatni czas modyfikacji. –

Odpowiedz

0

time.ctime zwraca łańcuch i 'Fri Feb 08 16:34:53 2013' < 'Mon Sep 24 00:50:07 2012'

21

time.ctime() formatuje czas jako ciąg, więc jesteś porównując struny "Fri Feb 08 16:34:43 2013" i "Sat Sep 22 14:19:32 2012" tekstowo. Tylko nie rób tego i porównać float jakoby getmtime() daje bezpośrednio:

pytime = os.path.getmtime(os.path.join(root, sc)) 
# ... 
txttime = os.path.getmtime(os.path.join(root, txt)) 
# ... 
if (txttime > pytime): 
    # ... 
+0

Dziękuję Teraz działa dobrze. Mój problem został rozwiązany, ale jak mój kod w przekazywaniu "Pass" przez cały czas przez porównanie ciągów. Czy jest to porównanie wartości ASCII? – AshA

+0

@AshA Tak. Zasadniczo porównuje to, czy ciąg 'Fri ...' pojawiłby się w słowniku przed łańcuchem 'Sat ...', co spowodowałoby, że 'F' pojawi się przed' S'. – millimoose

+0

Dziękuję bardzo. Problem i rozwiązania są teraz jasne. – AshA

Powiązane problemy