Python 3.8 обрабатывает «open» как импортированный метод openpyxl вместо встроенной функции - PullRequest
1 голос
/ 01 апреля 2020

У меня есть некоторый код, в котором мне нужно открывать файлы, которые иногда являются файлами .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 функция вместо?

1 Ответ

0 голосов
/ 05 мая 2020

У меня была такая же проблема, и я исправил ее, ограничив импорт. Поскольку я использовал только функцию load_workbook, я заменил from openpyxl import * на from openpyxl import load_workbook.

...