2015-06-04 2 views
3

Я попытался успешно конвертировать файл excel в csv, но он преобразовал все мои номера (несмотря на то, что они были целыми или текстовыми в файле excel), чтобы плавать.Python xlrd преобразует целые числа и строки в поплавки

Я знаю, что python считывает по умолчанию числа как плавающие.

есть ли шанс превратить все мои номера в строки?

мой код ниже

def Excel2CSV(ExcelFile, SheetName, CSVFile): 
import xlrd 
import csv 
workbook = xlrd.open_workbook(ExcelFile) 
worksheet = workbook.sheet_by_name(SheetName) 
csvfile = open(CSVFile, 'wb') 
wr = csv.writer(csvfile, delimiter=';', quoting=csv.QUOTE_NONNUMERIC) 

for rownum in xrange(worksheet.nrows): 
    wr.writerow(
     list(x.encode('utf-8') if type(x) == type(u'') else x 
       for x in worksheet.row_values(rownum))) 

csvfile.close() 

спасибо за ваше время

+0

Это shoud не конвертирует _text_ в поплавки, но нет никаких шансов с целыми числами, потому что Excel не делает этого различия, поэтому каждое число является float. Типовой тест лучше выражается как 'isinstance (x, unicode)' кстати. – BlackJack

+3

Это не Python, который «читает числа как плавающие». Это Excel, который хранит * каждое * числовое значение как float. Я бы использовал разные формулировки, чем BlackJack: это не так, что Excel «не различает» между целыми числами и поплавками; это то, что Excel ** не имеет никакого числового типа, кроме float. –

+0

В зависимости от того, что вы ожидаете от ввода, вы можете попробовать разобрать значение как int 'unicode (int (workheet.cell_value (r, c))). Этот подход завершится неудачно, если у вас есть текстовая строка «042.0», и вы не хотите отбрасывать ведущие или завершающие нули. Я думаю, что это может закончиться неудачно для логических и некоторых дат. Более надежным является использование типа [cell type] (http://www.lexicon.net/sjmachin/xlrd.html#xlrd.Cell-class), чтобы выяснить, как вы должны преобразовать значение ячейки. – romanows

ответ

0

Моя работа вокруг было лечить файл Excel Cell-на-Cell сначала через новый вложенный список, а затем писать этот вложенный список в файл CSV.

Получив доступ к отдельным значениям ячеек, я могу преобразовать их в типы данных строк, которые оставляют внутренние элементы ячейки как есть в CSV-файле (при этом, конечно, кавычки String удалены).

Вот как получить доступ к отдельной ячейке значения:

for rownum in xrange(worksheet.nrows): 
    for col_num in xrange (worksheet.ncols) : 
     value = str (worksheet.row (rownum) [ column_num ].value) 

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

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