KeyError: "There is no item named 'xl/sharedStrings.xml' in the archive"
при попытке открытия xlsx файла появляется такая ошибка
Traceback (most recent call last): File "C:/Users/4r4r5/PycharmProjects/untitled2/Main.py", line 10, in matcher.rename_drugs() File "C:\Users\4r4r5\PycharmProjects\untitled2\Matcher.py", line 196, in rename_drugs self.__directory + file) # for files from directory creates csv copy File "C:\Users\4r4r5\PycharmProjects\untitled2\Matcher.py", line 94, in __csv_from_excel wb = openpyxl.load_workbook(datapath) File "C:\Users\4r4r5\PycharmProjects\untitled2\venv\lib\site-packages\openpyxl\reader\excel.py", line 314, in load_workbook reader.read() File "C:\Users\4r4r5\PycharmProjects\untitled2\venv\lib\site-packages\openpyxl\reader\excel.py", line 274, in read self.read_strings() File "C:\Users\4r4r5\PycharmProjects\untitled2\venv\lib\site-packages\openpyxl\reader\excel.py", line 143, in read_strings with self.archive.open(strings_path,) as src: File "C:\Users\4r4r5\AppData\Local\Programs\Python\Python37\lib\zipfile.py", line 1470, in open zinfo = self.getinfo(name) File "C:\Users\4r4r5\AppData\Local\Programs\Python\Python37\lib\zipfile.py", line 1398, in getinfo 'There is no item named %r in the archive' % name) KeyError: "There is no item named 'xl/sharedStrings.xml' in the archive"
мой код
def __csv_from_excel(filename, datapath): # read from datapath; write to filename
try:
if (datapath[-4:]) == "xlsx":
wb = openpyxl.load_workbook(datapath)
filenames = []
sheets = wb.sheetnames
for sheet in sheets:
sh = wb[str(sheet)]
with open(filename[:-4] + sheet + ".csv", 'tw', newline='') as f:
filenames.append(filename[:-4] + sheet + ".csv")
wr = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter=";")
for row in sh.rows:
temp = []
for cell in row:
temp.append(cell.value)
wr.writerow(temp)
f.close()
return filenames
elif (datapath[-4:]) == ".xls":
wb = xlrd.open_workbook(datapath, encoding_override="cp1251")
sheetlist = wb.sheet_names()
filenames = []
for sheet in sheetlist:
sh = wb.sheet_by_name(sheet)
with open(filename[:-4] + sheet + ".csv", 'tw', newline='') as f:
filenames.append(filename[:-4] + sheet + ".csv")
wr = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter=";")
for rownum in range(sh.nrows):
wr.writerow(sh.row_values(rownum))
f.close()
return filenames
except UnicodeDecodeError:
print(datapath)
Подскажите пожалуйста в чем может быть причина
Ответы (4 шт):
Просто попробуйте использовать pandas:
# вернет словарь датафреймов с ключами в качестве названий листов excel файла
dict_of_dfs = pd.read_excel('<path to excel file>', sheet_name=None) # sheet_name=None returns all sheets
И затем, чтобы использовать датафрейм:
df_sheet1 = dict_of_dfs['Sheet 1']
Также если вы собираетесь использовать библиотеки для работы с excel файлами, pandas может послужить конвертером и полученный датафрейм можно сохранить как excel файл:
df_sheet1.to_excel(excel_writer='<path to save excel file>', sheet_name='Sheet 1')
excel_file = openpyxl.load_workbook(filename='<path to save excel file>')
Это довольно старая ошибка - KeyError: "There is no item named 'xl/sharedStrings.xml' in the archive".
Если открыть xlsx файл как zip-архив, то можно увидеть что нужный файл есть, но первая буква - большая: 'xl/SharedStrings.xml'.
Похоже генерит такое какая-то из старых версий 1С или что-то похожее.
Решений может быть несколько:
- Использовать библиотеку xlrd v 1.2 - в ней был код, который учитывал подобные ошибки в архиве. В текущей версии - 2.x поддержку xlsx из этой библиотеке выкинули.
- Исправить архив с помощью libreoffice - он умеет корректно открывать такие файлы.
- Исправить архив самостоятельно - перепаковав с исправленным именем.
Столкнулся с такой же проблемой, надеюсь, мой ответ кому-нибудь поможет.
import shutil
from zipfile import ZipFile
# Создаем временную папку
tmp_folder = '/tmp/convert_wrong_excel/'
os.makedirs(tmp_folder, exist_ok=True)
# Распаковываем excel как zip в нашу временную папку
with ZipFile('yourfile.xlsx') as excel_container:
excel_container.extractall(tmp_folder)
# Переименовываем файл с неверным названием
wrong_file_path = os.path.join(tmp_folder, 'xl', 'SharedStrings.xml')
correct_file_path = os.path.join(tmp_folder, 'xl', 'sharedStrings.xml')
os.rename(wrong_file_path, correct_file_path)
# Запаковываем excel обратно в zip и переименовываем в исходный файл
shutil.make_archive('yourfile', 'zip', tmp_folder)
os.rename('yourfile.zip', 'yourfile.xlsx')
У меня так же выгрузка файлов из 1С.
Смог обойти решениез без архивов вот таким способом:
Открываю через xlrd:
files_SPB_new = xlrd.open_workbook(r'X:\Отчет.xlsx')
А потом уже через панду, т.к. у меня все настроено на работу через Pandas
files_SPB_new = pd.read_excel(files_SPB_new)
xlrd версия 1.2.0.