2013-07-27 20 views
17

Jestem tylko początkującym w Pythonie, więc przepraszam za noobish pytanieDlaczego os.path.isfile zwraca false?

>>> import os 
>>> os.listdir("/home/user/Desktop/1") 
['1.txt', '2', '3.txt'] 
>>> os.path.isfile("/home/user/Desktop/1/1.txt") 
True 
>>> for i in os.listdir("/home/user/Desktop/1"): 
...  print(os.path.isfile(i)) 
... 
False 
False 
False 
>>> 

dwa z nich są pliki dlaczego wyjście jest False, gdy powinna być prawda?

Odpowiedz

22

Podczas drukowania os.path.isfile(i) sprawdza się, czy plik "1.txt" lub "2" lub "3.txt" jest plikiem, a po uruchomieniu os.path.isfile("/home/user/Desktop/1/1.txt") pełna ścieżka dostępu do pliku.

Spróbuj zastąpić tę linię z

print(os.path.isfile("/home/user/desktop/1/" + i)) 

Edit:

Jak wspomniano w komentarzu poniżej icktoofay, lepszym rozwiązaniem może być zastąpienie linii z

print(os.path.isfile(os.path.join("/home/user/desktop/1", i))) 

lub do wcześniejszego przechowywania "/ home/user/desktop/1" do pewnej zmiennej x, umożliwiając zamianę linii na

+2

Jeśli nazwa katalogu i nazwa pliku były zmienne, 'os.path. join' pozwoli ci uniknąć twardego kodowania '/' między nimi. – icktoofay

2

Problem dotyczy Twojego CWD (Current Working Directory), ponieważ os.listdir() daje pliki, które odnoszą się do podanej ścieżki i są niezgodne z CWD. Rozwiązaniem jest ustawienie w CWD przed użyciem os.listidr():

dir_to_delete = '/home/user/Desktop/1' 

os.chdir(dir_to_delete) 

[f for f in os.listdir() if os.path.isfile(f)] 

lub po prostu naprawić ścieżkę do plików:

[f for f in os.listdir(dir_to_delete) if os.path.isfile(os.path.join(dir_to_delete, f))] 
Powiązane problemy