2017-02-22 30 views
2

Я 99% пути там ...Написать один столбец файла XLSX в CSV с помощью питона xlrd

def xl_to_csv(xl_file): 
    wb = xlrd.open_workbook(xl_file) 
    sh = wb.sheet_by_index(0) 
    output = 'output.csv' 
    op = open(output, 'wb') 
    wr = csv.writer(op, quoting=csv.QUOTE_ALL) 

    for rownum in range(sh.nrows): 
     part_number = sh.cell(rownum,1) 
     #wr.writerow(sh.row_values(rownum)) #writes entire row 
     wr.writerow(part_number) 
    op.close() 

с помощью wr.writerow(sh.row_values(rownum)) я могу написать целую строку из файла Excel в CSV, но есть как 150 столбцов, и мне нужен только один из них. Итак, я хватаю один столбец, который я хочу использовать part_number = sh.cell(rownum,1), но я не могу заставить синтаксис правильно просто написать эту переменную в файл CSV.

Вот отслеживающий:

Traceback (most recent call last): 
    File "test.py", line 61, in <module> 
    xl_to_csv(latest_file) 
    File "test.py", line 32, in xl_to_csv 
    wr.writerow(part_number) 
_csv.Error: sequence expected 
+0

Что случилось с тем, что у вас есть в настоящее время? Если вы столкнулись с ошибками, добавьте эти ошибки в свой вопрос. Кроме того, какой столбец (первый или второй) вы пытаетесь получить? – Abdou

+0

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

+0

@StevenRumbalski Это хороший момент ... Я планировал добавить второе поле, но у меня может быть ADD, прежде чем я тестирую вывод ... –

ответ

2

Попробуйте это:

wr.writerow([part_number.value]) 

Аргумент должен быть список-подобный объект.

1

Самый быстрый починка бросать partnum в list (и в соответствии с Абду вам нужно добавить .value, чтобы получить значение из ячейки):

for rownum in range(sh.nrows): 
    part_number = sh.cell(rownum,1).value # added '.value' to get value from cell 
    wr.writerow([part_number]) # added brackets to give writerow the list it wants 

В целом, вы можете использовать список понимание, чтобы захватить нужные столбцы:

cols = [1, 8, 110] 
for rownum in range(sh.nrows): 
    wr.writerow([sh.cell(rownum, colnum).value for colnum in cols]) 
+0

Это превосходно - и очень полезно. Спасибо, Стивен! –