У меня есть некоторый код, в котором мне нужно открывать файлы, которые иногда являются файлами .csv, но иногда файлами .xlsx. Я импортировал openpyxl для обработки файлов Excel.
При переключении с Python 3.7 на 3.8 я обнаружил, что с помощью ключевого слова open (которое Я намереваюсь сослаться на Python встроенную open function ), вызывающую вызовы функции openpyxl load_workbook () , что не то, что я хочу.
Вот фрагмент кода, который демонстрирует проблему:
from openpyxl import *
from tkinter import *
import tkinter.filedialog
root = Tk()
root.withdraw()
fileName = tkinter.filedialog.askopenfilename(parent=root, title='Select file.')
with open(fileName, 'w', encoding='utf-8') as file:
print('fileName')
Этот код должен:
- Всплывающее диалоговое окно с предложением выбрать файл
- Откройте этот файл в Python
- Напечатайте его имя файла
В 3.7 это именно то, что он делает; скрипт работает нормально и выводит имя файла. Однако, когда я запускаю его в 3.8, я получаю следующее сообщение об ошибке:
Traceback (most recent call last):
File "C:\Users\[username]\Documents\Python Scripts\test\test.py", line 10, in <module>
with open(fileName, 'w', encoding='utf-8') as file:
TypeError: load_workbook() got an unexpected keyword argument 'encoding'
load_workbook () метод безумный, потому что я передал ему аргумент 'кодирования', который он не ожидал. Если я уберу аргумент 'encoding', я получу следующую ошибку:
Traceback (most recent call last):
File "C:\Users\[username]\Documents\Python Scripts\test\test.py", line 10, in <module>
with open(fileName, 'w') as file:
File "C:\Users\[username]\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\reader\excel.py", line 312, in load_workbook
reader = ExcelReader(filename, read_only, keep_vba,
File "C:\Users\[username]\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\reader\excel.py", line 124, in __init__
self.archive = _validate_archive(fn)
File "C:\Users\[username]\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\reader\excel.py", line 94, in _validate_archive
raise InvalidFileException(msg)
openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support .csv file format, please check you can open it with Excel first. Supported formats are: .xlsx,.xlsm,.xltx,.xltm
Теперь это безумие, потому что я пытаюсь открыть файл .csv, а openpyxl может открывать только файлы Excel. Но я не понимаю, почему openpyxl здесь даже участвует - все, что я сделал, это импортировал модуль вверху! Ключевое слово open должно вызывать встроенную функцию Python, а не метод из openpyxl.
Вопросы:
- Почему load_workbook () вызывается при этих обстоятельствах в 3.8 (но не в 3.7)?
- Как я могу убедить Python использовать встроенный open функция вместо?