Почему мой код tkinter для открытия файла не работает?

Я пытаюсь создать приложение, позволяющее пользователю нажать кнопку и открыть файл csv, а затем сделать копию этого файла в определенном каталоге, однако первая строка кода в функции не будет работать. Ниже приведен фрагмент кода.

import os
import pandas as pd
from tkinter import filedialog
import ttkbootstrap as tb


root = tb.Window(themename='superhero')

def add_spreadsheet():
    spreadsheet_filepath = filedialog.askopenfilename(initialdir='C:\Users\peter\Downloads',
                                                      title='Select A File', filetypes=
                                                      ('csv files', '*.csv'))
    file_name = os.path.basename(spreadsheet_filepath)
    df = pd.read_csv(spreadsheet_filepath)
    output_path = os.path.join('csv files/', f'{file_name}')
    df.to_csv(output_path, index=False)

# create add button to add a spreadsheet to a file
home_add_btn = tb.Button(root, text='Add', command=add_spreadsheet)
home_add_btn.pack(anchor='center', pady=10)

root.mainloop()

Я пробовал онлайн, но ничего не смог понять.

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
90
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В строках символ "" имеет особые свойства. Чтобы решить текущую проблему, просто используйте вместо этого «\\"...

Например:

spreadsheet_filepath = filedialog.askopenfilename(initialdir='C:\\Users\\peter\\Downloads',
                                                      title='Select A File', filetypes=
                                                      ('csv files', '*.csv'))

Просто замените свой код приведенным выше сегментом кода, и он должен работать.

Проблема, с которой вы столкнулись, скорее всего, связана с синтаксической ошибкой, возможно, такой:

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

(По крайней мере, это то, что я получаю, когда запускаю ваш код). В сообщении об ошибке говорится, что произошла ошибка «Юникода». Проблема с вашим кодом — строковый литерал пути к файлу в первой строке вашей функции add_spreadsheet. В частности, эта строка:

spreadsheet_filepath = filedialog.askopenfilename(initialdir='C:\Users\peter\Downloads', title='Select A File', filetypes=('csv files', '*.csv'))

Обычные строки будут интерпретировать обратную косую черту (\) и последующие символы как так называемые «escape-последовательности». Например, строка "Hello World\nHello World again" будет интерпретироваться как "Hello World", затем символ новой строки и, наконец, "Hello World again". Некоторые распространенные escape-последовательности включают \n (новая строка), \t (табуляция), \r (перевод строки) и \uxxx (символ Юникода с порядковым номером xxx). Если символ после обратной косой черты не является одной из допустимых escape-последовательностей, Python выдаст ошибку Юникода. К сожалению, пути к файлам обычно указываются с символами обратной косой черты внутри. Для решения этой проблемы существует два подхода:

  1. Используйте двойную обратную косую черту (\\). Это позволит избежать escape-последовательности и сделать ее действительной. Пример:
spreadsheet_filepath = filedialog.askopenfilename(initialdir='C:\\Users\\peter\\Downloads', title='Select A File', filetypes=('csv files', '*.csv'))

Это нормально с синтаксической точки зрения и может быть единственным выбором, если другие обратные косые черты предназначены для реальных escape-последовательностей, например, новой строки (\n). Но если нет, то второй подход работает лучше.

  1. Используйте необработанные строки. Их называют «необработанными» строками, поскольку они не преобразуют обратную косую черту и escape-последовательности в их фактическую форму. Таким образом, любое количество обратных косых черт и escape-последовательностей, которые в противном случае недействительны, не вызовут ошибку. Измените свой код к этому:
spreadsheet_filepath = filedialog.askopenfilename(initialdir=r'C:\Users\peter\Downloads', title='Select A File', filetypes=('csv files', '*.csv'))

Этот подход не только экономит время на вводе текста, если имеется много недопустимых escape-символов, но также дает понять, что эта строка является «необработанной». Поэтому я настоятельно рекомендую последний подход. Однако, если вам нужен символ новой строки или другие допустимые escape-символы, вам нужно использовать первый метод.

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

Есть две вещи, которые вам нужно улучшить:

  1. Обратная косая черта в вашем пути будет интерпретироваться как escape-последовательность . Вы можете предотвратить это, если используете необработанную строку. Это делает префикс с буквой r или R перед именем пути.

Другие варианты имен путей , но, на мой взгляд, предпочтительнее необработанная строка.

  1. Я также добавил скобки вокруг вашего filetypes, потому что они определяются как последовательность кортежей, см. документ.
spreadsheet_filepath = filedialog.askopenfilename(initialdir= r'C:\Users\peter\Downloads', title='Select A File', defaultextension = ".csv", filetypes=[("CSV Files", "*.csv")])

Вот фиктивный код, который открывает диалоговое окно файла:

from tkinter import *
from tkinter import filedialog

root = Tk() 

def add_spreadsheet():
    spreadsheet_filepath = filedialog.askopenfilename(initialdir= r'C:\Users',
                                                      title='Select A File', filetypes=
                                                      [('csv files', '*.csv')])
    file_name = os.path.basename(spreadsheet_filepath)
    df = pd.read_csv(spreadsheet_filepath)
    output_path = os.path.join('csv files/', f'{file_name}')
    df.to_csv(output_path, index=False)

# create add button to add a spreadsheet to a file
home_add_btn = Button(root, text='Add', command=add_spreadsheet)
home_add_btn.pack(anchor='center', pady=10)

root.mainloop()

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