2016-10-13 2 views
0

В настоящее время я работаю над файлом Excel и принимая свой путь в качестве входных данных вПринятие Excel файла с IO потоком

myObj = ProcessExcelFile("C:\SampleExcel.xlsx") 

конструктора как

def __init__(self, filepath): 
    ''' 
    Constructor 
    ''' 
    if not os.path.isfile(filepath): 
     raise FileNotFoundError(filepath) 

    self.datawb = xlrd.open_workbook(filepath) 

но теперь от другого интерфейса я хочу используйте тот же класс, но он не отправляет мне filepath его посылку мне файла через поток io как

data = req.stream.read(req.content_length) 
file = io.BytesIO(data) 

сейчас этот файл Переменная, когда я прохожу в моем файле, как

myObj = ProcessExcelFile(file) 

Это дает мне ошибку

TypeError: argument should be string, bytes or integer, not _io.BytesIO 

Я хочу, чтобы мой инициализации, так что это может занять путь, а также поток Io или, если его не представляется возможным , Мне нужно иметь файл из io-потока в качестве приоритета

ответ

2

Вам нужно будет изменить свой класс, чтобы разрешить потоки. Пропустите поток до open_workbook через file_contents.

def __init__(self, filepath, stream=False): 
    ''' 
    Constructor 
    ''' 
    if stream: 
     self.datawb = xlrd.open_workbook(file_contents=filepath.read())  
    else:   
     if not os.path.isfile(filepath): 
      raise FileNotFoundError(filepath) 
     self.datawb = xlrd.open_workbook(filepath) 
+1

В этом случае, если я передам поток, он все равно попадет в FileNot found exception right? Мне нужно положить это в другую часть –

+0

Да, я только что осознал ту же ошибку копирования и вставки. Я обновлю ответ. –

+0

это сработало! большое спасибо ! Мне очень жаль, но эта простая вещь я не смог правильно ее правильно –

Смежные вопросы