Brian Powell
Brian Powell

Reputation: 3411

Write a single column of an xlsx file to csv using python xlrd

I am 99% of the way there...

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()

using wr.writerow(sh.row_values(rownum)) I can write the entire row from the Excel file to a CSV, but there are like 150 columns and I only want one of them. So, I'm grabbing the one column that I want using part_number = sh.cell(rownum,1), but I can't seem to get the syntax correct to just write this variable out to a CSV file.

Here's the traceback:

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

Upvotes: 2

Views: 589

Answers (2)

Steven Rumbalski
Steven Rumbalski

Reputation: 45542

The quickest fix is to throw your partnum in a list (and as per Abdou you need to add .value to get the value out of a cell):

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

More generally, you can use a list comprehension to grab the columns you want:

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

Upvotes: 1

Paulo Scardine
Paulo Scardine

Reputation: 77271

Try this:

wr.writerow([part_number.value])

The argument must be a list-like object.

Upvotes: 2

Related Questions