2015-08-06 3 views
0

Этот код должен получить строковое значение из файла excel. Значение как никогда не распознается как строка. Как я могу получить запрос в виде строки? str (string), похоже, не работает.Признание значения как строки

def main(): 
    file_location = "/Users/ronald/Desktop/Twitter/TwitterData.xlsx" 
    workbook = xlrd.open_workbook(file_location) #open work book 
    worksheet = workbook.sheet_by_index(0) 
    num_rows = worksheet.nrows - 1 
    num_cells = worksheet.ncols - 1 
    curr_row = 0 
    curr_cell = 3 
    count = 0 
    string = 'tweet' 
    tweets = [] 
    while curr_row < num_rows: 
     curr_row += 1 
     tweet = worksheet.cell_value(curr_row, curr_cell) 
     tweet.encode('ascii', 'ignore') 
     #print tweet 
     query = str(tweet) 
     if (isinstance(query, str)): 
      print "it is a string" 
     else: 
      print "it is not a string" 

Это ошибка, которую я продолжаю получать.

UnicodeEncodeError: 'ascii' codec can't encode characters in position 102-104: ordinal not in range(128)

+0

Является ли ваш вышеприведенный код печати «это не строка»? Очень вряд ли. –

+0

Да. Это было, пока я не добавил этот «запрос = str (твит)», а затем я получил ошибку выше. @AnandSKumar – user3078335

+0

Почему вы хотите кодировать, используя 'ascii'? –

ответ

1

В Python существуют два разных типа, которые представляют разные строки по-разному.

  1. str или bytes: Это значение по умолчанию в Python 2 (отсюда str), называется bytes в Python 3. Он представляет собой строку в виде последовательности байтов, которая не работает очень хорошо для Юникода, потому что каждый символ не обязательно один байт, как в ASCII и некоторых других кодировках.

  2. unicode или str: Это значение по умолчанию в Python 3. Unicode обрабатывает символы с акцентами и международными символами, поэтому особенно когда речь идет о чем-то вроде Twitter, это то, что вы хотите. В Python 2 это также приводит к тому, что некоторые строки имеют небольшой префикс u''.

Ваша "это строка?" тест состоит из isinstance(s, str), который проверяет только первый тип и игнорирует другой. Вместо этого вы можете протестировать против basestring - isinstance(s, basestring) - так как он является родителем обоих str и unicode. Это правильно отвечает на вопрос «это строка?». для Python 2, и именно поэтому вы получаете вводящие в заблуждение результаты.

Обратите внимание, что если вы когда-либо переходите на Python 3, basestring не существует. Это только тест Python 2.