Ошибка при попытке открыть текстовый файл в Python

Я создаю приложение с использованием Custom Tkinter, и в этом приложении я хочу создать кнопки на основе файлов .txt в папке и заставить кнопки копировать содержимое этих файлов .txt. Простые кнопки копирования/вставки.

Этот класс для кнопок ОТЛИЧНО работал на моем Mac, но теперь в Windows он выдает ошибку.

Я проверил несколько обсуждений, но безуспешно. пример попробовал "encoding="utf-8"", не сработало.

class CopyPaste(customtkinter.CTkScrollableFrame):

    def __init__(self, master):
        super().__init__(master)

        global counter
        counter = 1

        self.Header = customtkinter.CTkLabel(self, text = "Template Answers",
                                             font=("Arial", 20))
        self.Header.grid(row=0, column=0, padx=10, pady=10, sticky = "w")

        target_directory = "C:/ToolKit Files"

        def read_file(file_path):
            with open(file_path, "r") as file:
                content = file.read()
            return content

        def create_button(self, file_path):

            file_name = os.path.basename(file_path)

            def on_button_click():
                pyperclip.copy(read_file(file_path))

            button = customtkinter.CTkButton(self, text=file_name, command=on_button_click)
            button.grid(row=counter, column=0, padx=10, pady=5)

        def create_buttons(self, target_directory):

            file_names = [file for file in os.listdir(target_directory) if file.endswith('.txt')]
            for file_name in file_names:
                global counter
                file_path = os.path.join(target_directory, file_name)
                create_button(self, file_path)
                counter += 1

        create_buttons(self, target_directory)

После запуска этого скрипта я получаю:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\USER\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
  File "C:\Users\USER\PycharmProjects\SidekickToolKit\venv\lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 554, in _clicked
    self._command()
  File "C:\Users\USER\PycharmProjects\SidekickToolKit\main.py", line 162, in on_button_click
    pyperclip.copy(read_file(file_path))
  File "C:\Users\USER\PycharmProjects\SidekickToolKit\main.py", line 154, in read_file
    content = file.read()
  File "C:\Users\USER\AppData\Local\Programs\Python\Python39\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 448: character maps to <undefined>

Помощь очень ценится :D

С моей стороны все работает отлично. Я думаю, что один из символов, которые вы ввели в один из файлов .txt, не может быть прочитан Python. Попробуйте изменить кодировщик, читающий файлы, или попробуйте изменить содержимое файлов .txt.

fastattack 19.04.2024 10:21

@fastattack Привет! Спасибо, хотя я пробовал менять содержимое файлов, но теперь все равно не копируются файлы, а просто пустая копия... :( Как поменять кодировщик чтения файлов? Спасибо большое!

Kooritsmani 19.04.2024 11:56
Почему в 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
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

ваш код выглядит нормально, я думаю, что еще нужно сделать, что вызывает ошибку, UnicodeDecodeErrortraceback is for you to tell Python theencoding`, которую нужно использовать для чтения файла.

Вот обновление вашего кода:


def read_file(file_path):
       # wrap the entire code snippet in a try-catch block
       try:
           with open(file_path, "r", encoding = "utf-8") as file:
               content = file.read()
           return content
      # catch the error if any
       except UnicodeDecodeError:
           return f'Error reading file {file}.'

Я считаю, что ваш код теперь должен работать, поскольку вы установили кодировку utf-8. Если кодировка, установленная на utf-8, не работала после того, как вы обновили свою операционную систему, хотя я использую Linux, вы можете установить это — errors='ignore' туда, где мы поместили параметр кодировки. Удачи, приятель.

Привет. Спасибо за это! Теперь он работает лучше, но я также понял, что он создает по 2 кнопки для каждого текстового файла. первый набор кнопок называется «._FileName.txt» и выдает ошибку, а другой набор кнопок называется «FileName.txt» (правильный способ, и они работают). Почему это может быть? Кажется, цикл «Создание кнопок» выполняется дважды с разными результатами?

Kooritsmani 19.04.2024 13:42

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

Blaisemart 19.04.2024 13:46

Большое спасибо! Теперь все работает блестяще :) Ура! @blaisemart

Kooritsmani 20.04.2024 19:11

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