Python open () видає FileNotFoundError / IOError: Errno 2 Немає такого файлу або каталогу


80

З якоїсь причини у мого коду виникають проблеми з відкриттям простого файлу:

Це код:

file1 = open('recentlyUpdated.yaml')

І помилка:

IOError: [Errno 2] No such file or directory: 'recentlyUpdated.yaml'
  • Природно, я перевірив, що це правильна назва файлу.
  • Я намагався переміщатися по файлу, надаючи open()повний шлях до нього, і, здається, жоден із них не працює.

Переконайтеся, що ви бачите всі розширення файлів у Провіднику файлів ... Як я навчився важким способом.
VortexYT

Використовуєте PyCharm? ============= Позначте папку, де знаходиться файл .csv, як "вихідний корінь" -> клацніть правою кнопкою миші на папці та "Позначте каталог як" та виберіть "Кореневий код". Також перевірте робочий каталог у конфігурації Виконання / налагодження -> меню Виконання -> Редагувати конфігурацію -> Виберіть файл Python на лівій панелі -> Переконайтеся, що Робочий каталог є кореневою папкою вашого проекту [ jetbrains.com/help/pycharm/ … [1]: jetbrains.com/help/pycharm/…
Хасан Накві

Відповіді:


99
  • Переконайтесь, що файл існує: використовуйте os.listdir()для перегляду списку файлів у поточному робочому каталозі
  • Переконайтесь, що ви перебуваєте в каталозі, у якому ви думаєте os.getcwd()(якщо ви запускаєте свій код із IDE, ви цілком можете бути в іншому каталозі)
  • Тоді ви можете:
    • Зателефонуйте os.chdir(dir), dirбудучи папкою, де знаходиться файл, а потім відкрийте файл із лише його назвою, як ви робили.
    • Вкажіть абсолютний шлях до файлу у своєму openдзвінку.
  • Не забувайте використовувати необроблений рядок, якщо ваш шлях використовує зворотні скісні риски, наприклад: dir = r'C:\Python32'
    • Якщо ви не використовуєте raw-string, вам доведеться уникати кожної косої риски: 'C:\\User\\Bob\\...'
    • Похилі риски також працюють у Windows, 'C:/Python32'і їх не потрібно уникати.

Дозвольте мені пояснити, як Python знаходить файли:

  • Абсолютний шлях шлях , який починається з кореневої директорії вашого комп'ютера, наприклад , «C: \ Python \ Scripts ..» якщо ви на Windows.
  • Відносний шлях це шлях , що починається не з кореневої директорії вашого комп'ютера, і замість того, щоб по відношенню до чого - то називається working directory. Ви можете переглянути поточний робочий каталог Python, зателефонувавши os.getcwd().

Якщо ви спробуєте це зробити open('sortedLists.yaml'), Python побачить, що ви передаєте йому відносний шлях, тому він буде шукати файл у поточному робочому каталозі. Виклик os.chdirзмінить поточний робочий каталог.

Приклад: Скажімо, file.txtзнайдено в C:\Folder.

Щоб відкрити його, ви можете зробити:

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

або

open(r'C:\Folder\file.txt') #full path

Коли я використовую os.chdir (dir), чи потрібно мені розміщувати шлях до каталогу або просто ім'я каталогу? Крім того, як тільки я отримую ім'я файлу, чи поміщаю це у open () чи пишу open (os.chdir (dir))?
Сантьяго

@ Сантьяго Я це пояснив у своїй відповіді.
Lanaru

3
+ 1 для сирого рядка r ''
WKordos

Тим самим методом можна відкрити будь-який тип файлу. Однак вам доведеться передати a 'b'як другий аргумент у функції open, щоб вказати, що ви читаєте файл як двійкові дані.
Lanaru

3
+1 для пропозиції os.listdir (). Це один із тих моментів, коли ви кладете обличчя на клавіатуру, але якщо ви працюєте в Windows 10, переконайтеся, що ви вручну не додали розширення файлу там, де воно вже є. Представлення за замовчуванням у Windows часто приховує розширення, і це може виглядати як 'fileName.txt', де ім'я насправді є 'fileName.txt.txt', якщо ви допустили цю помилку. Щоб перевірити, уважно подивіться на результат os.listdir (). Це невідповідність імені файлу також дасть вам помилку "[Errno 2] Немає такого файлу або каталогу:". Я знаю, я знаю. На моєму лобі все ще є відбитки пробілу.
DCaugs

13

Швидше за все, проблема полягає в тому, що ви використовуєте відносний шлях до файлу, щоб відкрити файл, але для поточного робочого каталогу не встановлено те, що ви думаєте.

Поширеною помилкою є те, що відносні шляхи відносяться до розташування сценарію python, але це неправда. Відносні шляхи до файлів завжди відносяться до поточного робочого каталогу, і поточний робочий каталог не повинен бути місцем розташування вашого сценарію python.

У вас є три варіанти:

  • Використовуйте абсолютний шлях, щоб відкрити файл:

    file = open(r'C:\path\to\your\file.yaml')
    
  • Створіть шлях до файлу щодо вашого сценарію python:

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

    (Див. Також: Як отримати шлях та ім’я файлу, який виконується на даний момент? )

  • Змініть поточний робочий каталог перед відкриттям файлу:

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

Інші поширені помилки, які можуть спричинити помилку "файл не знайдений", включають:

  • Випадково використовуючи екрануючі послідовності у шляху до файлу:

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

    Щоб уникнути цієї помилки, не забудьте використовувати необроблені рядкові літерали для шляхів до файлів:

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

    (Див. Також: Шлях Windows у Python )

  • Забувши, що Windows не відображає розширення файлів:

    Оскільки Windows не відображає відомі розширення файлів, іноді, коли ви думаєте, що ваш файл іменований file.yaml, він насправді називається file.yaml.yaml. Перевірте розширення файлу.


6

Файл може існувати, але може мати інший шлях. Спробуйте написати абсолютний шлях до файлу.

Спробуйте os.listdir() функцію, щоб перевірити, що принаймні python бачить файл.

Спробуйте так:

file1 = open(r'Drive:\Dir\recentlyUpdated.yaml')

1
здається, він не може розпізнати будь-які шляхи до файлів на моєму комп'ютері. Чи є спосіб шукати файл? @sshekar
Сантьяго

2

Можливо, ви закрили "файл1".
Просто використовуйте прапор 'w', який створює новий файл:

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

mode - це необов'язковий рядок, який визначає режим відкриття файлу. За замовчуванням значення "r" означає "відкрито для читання в текстовому режимі". Інші поширені значення - `` w '' для запису (скорочення файлу, якщо він уже існує) ...

(див. також https://docs.python.org/3/library/functions.html?highlight=open#open )


1

Якщо є VSCode, перегляньте робочу область. Якщо ви перебуваєте в іншій робочій області, ця помилка може зрости


Дякую! Потрібно для відкриття нової папки, Optimus Prime!
m4n0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.