Python open() daje FileNotFoundError/Ioerror: Errno 2 brak takiego pliku lub katalogu

Z jakiegoś powodu mój kod ma problem z otwarciem prostego pliku:

Oto kod:

file1 = open('recentlyUpdated.yaml')

A błąd to:

IOError: [Errno 2] No such file or directory: 'recentlyUpdated.yaml'
  • oczywiście sprawdziłem, czy jest to prawidłowa nazwa pliku.
  • próbowałem poruszać się po pliku, dając open() pełną ścieżkę do pliku i nic z tego nie działa.
Author: mkrieger1, 2012-08-30

5 answers

  • upewnij się, że plik istnieje: użyj os.listdir(), aby zobaczyć listę plików w bieżącym katalogu roboczym
  • upewnij się, że jesteś w katalogu, w którym myślisz, że jesteś w os.getcwd() (jeśli uruchomisz kod z IDE, możesz być w innym katalogu)
  • możesz wtedy albo:
    • Call os.chdir(dir), dir jako folder, w którym znajduje się plik znajduje się, a następnie otwórz plik z jego nazwą, tak jak to robiłeś.
    • Określ bezwzględną ścieżkę do pliku w swoim open sprawdzam.
  • pamiętaj, aby użyć surowego ciągu znaków, jeśli ścieżka używa ukośników wstecznych, jak więc: dir = r'C:\Python32'
    • jeśli nie używasz raw-string, musisz uciec od każdego ukośnika: 'C:\\User\\Bob\\...'
    • ukośniki do przodu działają również w systemie Windows 'C:/Python32' i nie muszą być zabezpieczone.

Pozwól mi wyjaśnić, jak Python znajduje pliki:

  • an absolute path jest ścieżką zaczynającą się od katalogu głównego komputera, na przykład 'C:\Python\scripts.."if jesteś na Windows.
  • a ścieżka względna jest ścieżką, która nie zaczyna się od katalogu głównego komputera, a zamiast tego jest względna do czegoś, co nazywa się working directory. Możesz wyświetlić bieżący katalog roboczy Pythona, wywołując os.getcwd().

Jeśli spróbujesz wykonać open('sortedLists.yaml'), Python zobaczy, że przekazujesz mu ścieżkę względną, więc będzie szukał pliku wewnątrz bieżącego katalogu roboczego. Wywołanie os.chdir zmieni bieżące działanie katalog.

Przykład: powiedzmy file.txt znajduje się w C:\Folder.

Aby go otworzyć, możesz zrobić:

os.chdir(r'C:\Folder')
open('file.txt') #relative path, looks inside the current working directory

Lub

open(r'C:\Folder\file.txt') #full path
 101
Author: Lanaru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-09 08:18:56

Najprawdopodobniej problem polega na tym, że używasz względnej ścieżki pliku do otwarcia pliku, ale bieżący katalog roboczy nie jest ustawiony na to, co myślisz.

Jest to powszechne błędne przekonanie, że ścieżki względne są względne do lokalizacji skryptu Pythona, ale jest to nieprawdziwe. Względne ścieżki plików są zawsze względem bieżącego katalogu roboczego, a bieżący katalog roboczy nie musi być lokalizacją skryptu Pythona.

Masz trzy opcje:

  • Użyj ścieżki bezwzględnej, aby otworzyć plik:

    file = open(r'C:\path\to\your\file.yaml')
    
  • Wygenerowanie ścieżki do pliku względem skryptu Pythona:

    from pathlib import Path
    
    script_location = Path(__file__).absolute().parent
    file_location = script_location / 'file.yaml'
    file = file_location.open()
    

    (Zobacz także: Jak uzyskać ścieżkę i nazwę aktualnie wykonywanego pliku?)

  • Zmiana bieżącego katalogu roboczego przed otwarciem pliku:

    import os
    
    os.chdir(r'C:\path\to\your\file')
    file = open('file.yaml')
    

Inne typowe błędy, które mogą spowodować " plik nie znaleziono " błąd zawiera:

  • Przypadkowe użycie sekwencji specjalnych w ścieżce pliku:

    path = 'C:\Users\newton\file.yaml'
    # Incorrect! The '\n' in 'Users\newton' is a line break character!
    

    Aby uniknąć tego błędu, pamiętaj, aby używać nieprzetworzonych literałów łańcuchowych dla ścieżek plików:

    path = r'C:\Users\newton\file.yaml'
    # Correct!
    

    (Zobacz także: ścieżka Windows w Pythonie )

  • Zapominając, że Windows nie wyświetla rozszerzeń plików:

    Ponieważ system Windows nie wyświetla znanych rozszerzeń plików, czasami, gdy wydaje ci się, że Twój plik ma nazwę file.yaml, właściwie nazywa się file.yaml.yaml. Sprawdź jeszcze raz rozszerzenie pliku.

 13
Author: Aran-Fey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-08 22:39:52

Plik może istnieć, ale może mieć inną ścieżkę. Spróbuj zapisać ścieżkę bezwzględną do pliku.

Spróbuj użyć funkcji os.listdir(), aby sprawdzić, czy przynajmniej python widzi plik.

Spróbuj TAK:

file1 = open(r'Drive:\Dir\recentlyUpdated.yaml')
 6
Author: heretolearn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-08 22:06:03

Możliwe, że zamknąłeś 'file1'.
Wystarczy użyć flagi 'w', aby utworzyć nowy plik:

file1 = open('recentlyUpdated.yaml', 'w')

Tryb jest opcjonalnym ciągiem znaków określającym tryb, w którym plik jest otwarty. Domyślnie jest to "r", co oznacza otwarte do czytania w tekście mode. Inne wspólne wartości to "w" do zapisu (obcinanie pliku, jeśli już istnieje)...

(Zobacz też https://docs.python.org/3/library/functions.html?highlight=open#open )

 2
Author: hesed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-15 09:46:57

Jeśli jest VSCode zobacz obszar roboczy. Jeśli jesteś w innym obszarze roboczym, ten błąd może wzrosnąć

 1
Author: zzfima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-28 11:56:03