У меня есть следующий код python, который работает, когда я запускаю его с помощью Pycharm:
def get_csv(): # Import data from a csv file
global df
import_file_path = filedialog.askopenfilename(filetypes=[("CSV file", '*.csv')])
if not import_file_path: # If user press cancel select path display error message
tk.messagebox.showwarning(title="Error message", message="CSV file import aborted.")
else:
# print("CSV path :", import_file_path)
with open(import_file_path, "rb") as csv_bin: # automatic CSV encoding detection
result = chardet.detect(csv_bin.read(10000))
encode = result['encoding']
# print("encoding :", encode)
with open(import_file_path) as csv_file:
reader = csv.reader(csv_file, delimiter=';')
first_row = next(reader)
num_cols = len(first_row)
if num_cols > 445:
df = pd.read_csv(import_file_path, sep=';', header=0, na_values=['#NV', ' '], decimal=',', encoding=encode)
tk.messagebox.showinfo(title="Import success", message="CSV file import successful !")
return df
else:
tk.messagebox.showwarning(title="Error message", message="CSV file not compatible")
Я использовал pyinstaller, чтобы получить EXE-файл, соответствующий моему python коду, но я получаю эта ошибка:
Exception in Tkinter callback
Traceback (most recent call last):
File "tkinter\__init__.py", line 1702, in __call__
File "import_CSV_python.py", line 30, in get_csv
File "c:\users\cyrille\appdata\local\programs\python\python37-32\lib\codecs.py
", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 1759: inval
id start byte
У меня нет этой ошибки, когда я запускаю свой код python с помощью Pycharm. Работает правильно. На другой машине у меня не было проблем с pyinstaller для создания рабочего EXE из файла python.
Я использую эту команду для вызова pyinstaller и создания EXE.
pyinstaller --onefile import_CSV_python.py
Я поискал в Интернете и нашел некоторых людей, у которых была такая же ошибка, как и у меня, и их решение - изменение файла compat.py. Для меня это звучит сложно, и я полностью потерялся. Я заранее изо всех сил пытался иметь несколько работающий EXE, который отображал бы маленькое окно с кнопкой для запуска моих различных функций. На другом моем компьютере (в настоящее время я работаю в родительском доме с другой машины) запуск pyinstaller для получения рабочего EXE из файла python вообще не проблема, он отлично работает.
Изменить: я попытался заменить строку out = out.decode(encoding)
в файле compat.py из пакета pyinstaller на out = out.decode(encoding, "replace")
or out = out.decode(encoding, "ingore")
, затем сохранил файл compat.py и снова сгенерировал EXE с помощью pyinstaller, но безрезультатно. У меня та же ошибка: utf8 не может декодировать
Edit2: Благодаря Джону Шакмейстеру я изменил эту строку
with open(import_file_path, encoding=encode) as csv_file:
Теперь она отлично работает.