Python - использовать для tablib для импорта файлов Excel (xls, xlsx)

Мне трудно понять, как импортировать файлы Excel в мой сценарий Python. Я всего несколько дней на Python, поэтому я предполагаю, что это очень очевидно, что я пропал без вести. Я использую Python 3 и модуль tablib. Из примеров на сайте tablib я разработал, как сохранять файлы в формате xls

def saveXLS(self, name, data): 
 # Form the dataset with the accompanying headers
 dataTab = tablib.Dataset()
 dataTab.headers = data[0][:]

 for i in range(1,len(data)):
 dataTab.append(data[i][:])

 with open(self.saveDir + name + ".xls", 'wb') as f:
 f.write(dataTab.xls)

(Я знаю, что цикл ужасен и не-Pythonic, но важно, чтобы я получил результаты на данный момент, поскольку это для работы). На данный момент я открываю книгу Excel и сохраняю ее в виде текстового файла (я должен указать, что все мои данные разделены табуляцией и состоят из строк, даже для чисел).

Я открываю его так

def loadTxt(self,name, fileType, data):
 if( fileType == "txt"): 
 with open(self.currentWorkingDir + "\\" + name + ".txt",'r') as f:
 reader=csv.reader(f,delimiter='\t')
 for X in reader:
 data.append(X)

Я попытался скопировать пример "dbf" на веб-сайте tablib (http://tablib.readthedocs.org/en/latest/api/), чтобы получить

def loadXLS(self):
 self.data = tablib.Dataset()
 self.data = open('Data.xlsx').read()
 return self.datav

И я получаю сообщение об ошибке (как я и ожидал, когда я вытащил его из своей задницы)

UnicodeDecodeError: кодек 'charmap' не может декодировать байт 0x8f в позиции 637: символьные карты.

Я действительно не знаю, как это понять, к сожалению, поэтому любой совет будет действительно оценен.

5 ответов

Вероятно, вы уже поняли это, но для следующего человека вам нужно прочитать файл Excel как двоичный:

my_input_stream = open("my_file.xlsx", "rb")
my_dataset = tablib.import_set(my_input_stream)
dataset[1:5]


В настоящее время tablib 0.12.1.

Я использую это для импорта базы данных.xlsx, созданной с помощью tablib, и вывода в файл excel.

Чтобы вернуть его в tablib:

import tablib

my_dataset = tablib.Dataset()
my_dataset.xlsx = open('input_file.xlsx', 'rb').read()
print(my_dataset)

и возвращает что-то вроде этого:

Email |Id |Name 
---------------------|-----|---------

[removed_email] |0 |My Name 
[removed_email] |1 |My Name1 
[removed_email] |2 |My Name2 
[removed_email] |3 |My Name3


Хотя более ранние ответы могут быть правильными в то время, я боюсь, что они теперь устарели из-за улучшений/изменений в библиотеке tablib. Здесь код, который работал для меня, и надеюсь, что это поможет следующему человеку: #Importing tablib library import tablib my_dataset = tablib.Dataset() my_dataset.xlsx = open('my_file.xlsx').read() print my_dataset


Я вижу две проблемы с расширением примера dbf. (Который заставил меня по пути заставить мой собственный пример работать. Спасибо!)

  1. Файл должен быть открыт в двоичном режиме.
  2. Данные должны быть привязаны к соответствующему представлению Dataset.

def loadXLS(self):
 self.data = tablib.Dataset()
 self.data.xls = open('Data.xls', 'rb').read()
 return self.data

Я не смог получить .xlsx работая, и подозреваю, что ему нужен специализированный процесс ввода. Я буду django_import_export создание набора данных XLSX django_import_export.


Он работает так

import tablib
f = open('my_file.xlsx', 'rb')
data = tablib.import_set(f.read(), format='xlsx')
data[0]

licensed under cc by-sa 3.0 with attribution.