Модуль python os видит элементы в папке, но не может их изменять

Я пытаюсь создать программу, которая просматривает список файлов .txt и добавляет их имена и содержимое в словарь. Программа правильно перемещается по папке, и я даже могу распечатать имена файлов в папке. Однако, когда я пытаюсь добавить имя файла и содержимое в словарь, я получаю эту ошибку в консоли,

Traceback (most recent call last):
  File "test.py", line 33, in <module>
    user1.append_journal_files(location)
  File "test.py", line 21, in append_journal_files
    with open(filename, 'r') as file_object:
FileNotFoundError: [Errno 2] No such file or directory: 'dump.0001.txt'

Я не уверен, почему файлы не распознаются как существующие, когда я пытаюсь ими манипулировать. Заранее благодарим вас за то, что нашли время взглянуть на это. Пожалуйста, дайте мне знать, если что-то нужно уточнить. Я новичок в программировании и хочу убедиться, что хорошо общаюсь. Еще раз спасибо.

     #Python Version 3.6.5

     #imports
        import os

        #classes
        class User():
            #Class that models a Revit user

            def __init__(self, username):
                '''initializes the class with a username, additional info
                   gathered after initialization'''
                self.username = username
                self.title = ""
                self.journal_log = {}

            def append_journal_files(self, directory_in_str):
                #appends all items of filetype in folder to dictionary instance.
                directory = os.fsencode(directory_in_str)
                for file in os.listdir(directory):
                    filename = os.fsdecode(file)
                    if filename.endswith(".txt"):
                        with open(filename, 'r') as file_object:
                            if filename not in self.journal_log.keys():
                                self.journal_log[filename] = file_object.readlines()
                            else:
                                continue
                        continue
                    else:
                        continue    

        #begin running program
        user1 = User("Christian")
        location = 'C:\\Users\Christian Gentry\AppData\Local\Autodesk\Revit\Autodesk Revit 2018\Journals'                  
        user1.append_journal_files(location)

Вы пропустили директорию в пути при открытии файла.

Klaus D. 18.04.2018 07:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
290
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

filename - это просто базовое имя, как и dump.0001.txt.

Если вы хотите открыть файл, вам нужен полный путь, например C:\Users\Christian Gentry\AppData\Local\Autodesk\Revit\Autodesk Revit 2018\Journals\dump0001.txt. (Это также может быть относительный путь от текущего рабочего каталога, но он должен быть путем, который приведет вас к файлу.)

Вы уже делаете это для listdir - вы не просто проходите мимо Journals и ожидаете, что это сработает, - и здесь та же идея.

Самое простое решение:

pathname = os.path.join(directory, filename)
with open(pathname, 'r') as file_object:

Пока мы на этом:

  • Вы убрали только одну из обратных косых черт в именах путей Windows. Технически, то, что у вас есть, правильно, потому что все другие компоненты пути начинаются с букв, которые не являются допустимыми обратными косыми чертами, но на самом деле это не очень хорошая вещь, на которую можно полагаться. Либо используйте необработанный строковый литерал, избегайте всех обратных косых черт или используйте прямые косые черты.
  • Вам не нужно указывать путь к fsencode, чтобы передать listdir, а к fsdecode - результаты, которые вы получите обратно. Если вы просто передадите строку, Python автоматически закодирует их соответствующим образом и автоматически декодирует результаты за вас.
  • Рассмотрите возможность использования pathlib вместо os; его немного легче понять новичкам, в нем намного легче ориентироваться, и он затрудняет выполнение множества мелких ошибок. До версии 3.6 его нельзя было использовать с большими фрагментами stdlib, но вы используете 3.6, так что это не имеет значения.

Привет, спасибо большое @abarnert! Я не понимал, что путь должен быть присоединен к имени файла. Единственное изменение, которое мне пришлось внести в ваше решение, было вместо pathname = os.path.join (каталог, имя файла), мне пришлось ввести pathname = os.path.join (directory_in_str, filename). Это решило мою проблему!

Christian Gentry 18.04.2018 08:05

Другие вопросы по теме