Я пытаюсь создать приложение, позволяющее пользователю нажать кнопку и открыть файл 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()
Я пробовал онлайн, но ничего не смог понять.
В строках символ "" имеет особые свойства. Чтобы решить текущую проблему, просто используйте вместо этого «\\"...
Например:
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 выдаст ошибку Юникода. К сожалению, пути к файлам обычно указываются с символами обратной косой черты внутри. Для решения этой проблемы существует два подхода:
\\
). Это позволит избежать escape-последовательности и сделать ее действительной. Пример:spreadsheet_filepath = filedialog.askopenfilename(initialdir='C:\\Users\\peter\\Downloads', title='Select A File', filetypes=('csv files', '*.csv'))
Это нормально с синтаксической точки зрения и может быть единственным выбором, если другие обратные косые черты предназначены для реальных escape-последовательностей, например, новой строки (\n
). Но если нет, то второй подход работает лучше.
spreadsheet_filepath = filedialog.askopenfilename(initialdir=r'C:\Users\peter\Downloads', title='Select A File', filetypes=('csv files', '*.csv'))
Этот подход не только экономит время на вводе текста, если имеется много недопустимых escape-символов, но также дает понять, что эта строка является «необработанной». Поэтому я настоятельно рекомендую последний подход. Однако, если вам нужен символ новой строки или другие допустимые escape-символы, вам нужно использовать первый метод.
Есть две вещи, которые вам нужно улучшить:
r
или R
перед именем пути.Другие варианты имен путей , но, на мой взгляд, предпочтительнее необработанная строка.
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()