2015-03-25 4 views
5

Я пытаюсь разобрать файл Excel.xlsx в файл csv. Вот файл Excel:Python xlrd parse Excel xlsx to csv с преобразованием даты

Date   Person 1  Person 2 
02/03/2015 Bob   James A  
03/03/2015 Billy  Nic  
04/03/2015 Sally  Mark  
05/03/2015 Alan   James A  
06/03/2015 James W  James A 

Мой Python скрипт:

import xlrd 
import csv 

book = xlrd.open_workbook('rota.xlsx') 

sheet = book.sheet_by_name('Sheet1') 

csvfile = open('output.csv', 'wb') 
wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL) 

for rownum in range(sheet.nrows): 
    wr.writerow(sheet.row_values(rownum)) 

csvfile.close() 

однако он выводит даты, как это:

Date,Person1,Person2 
41884,Bob,James B 
41885,Billy,Nic 
41886,Sally,Mark 
41887,Alan,James A 
41888,James W,James A 

Я знаю функции xldate_as_tuple или что-то вроде этого для преобразования вывода в значимые значения, но я не могу понять, как его использовать. Любая помощь Я был бы очень благодарен.

+1

У вас нет похожего * попробованного * на использование 'xldate_as_tuple' - почему бы и нет? – jonrsharpe

+0

Я не знаю, куда его просто поместить в мой код! – JamesPy

+0

Кривая обучения для меня это ... – JamesPy

ответ

3

Вот один из возможных решений:

import xlrd 
import csv 
from datetime import datetime 


book = xlrd.open_workbook('rota.xlsx') 
sheet = book.sheet_by_name('Sheet1') 
csvfile = open('output5.csv', 'wb') 

wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL) 
wr.writerow(sheet.row_values(0)) 

for rownum in range(1,sheet.nrows): 
    year, month, day, hour, minute, sec = xlrd.xldate_as_tuple(int(sheet.row_values(rownum)[0]), book.datemode) 
    py_date = datetime(year, month, day, hour, minute) 
    wr.writerow([py_date] + sheet.row_values(rownum)[1:]) 

csvfile.close() 

Выход:

"Date  "," Person 1","Person 2" 
"2015-02-03 00:00:00"," Bob  ","James A " 
"2015-03-03 00:00:00"," Billy ","Nic  " 
"2015-04-03 00:00:00"," Sally ","Mark " 
"2015-05-03 00:00:00"," Alan ","James A " 
"2015-06-03 00:00:00","James W ","James A " 

Version2:

Код:

#! /usr/bin/python 

import xlrd 
import csv 
from datetime import datetime 

book = xlrd.open_workbook('rota.xlsx') 
sheet = book.sheet_by_name('Sheet1') 
csvfile = open('output5.csv', 'wb') 
wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL) 

for rownum in range(sheet.nrows): 
    date = sheet.row_values(rownum)[0] 
    if isinstance(date, float) or isinstance(date, int): 
     year, month, day, hour, minute, sec = xlrd.xldate_as_tuple(date, book.datemode) 
     py_date = "%02d/%02d/%04d" % (month, day,year) 
     wr.writerow([py_date] + sheet.row_values(rownum)[1:]) 
    else: 
     wr.writerow(sheet.row_values(rownum)) 
csvfile.close() 

Выход:

"Date  "," Person 1","Person 2" 
"02/03/2015"," Bob  ","James A " 
"03/03/2015"," Billy ","Nic  " 
"04/03/2015"," Sally ","Mark " 
"05/03/2015"," Alan ","James A " 
"06/03/2015","James W ","James A " 
+0

Спасибо, но это дает мне ошибку: Traceback (последний звонок последний): Файл «pythonscript.py», строка 14, в год, месяц, день, час, минута, сек = xlrd.xldate_as_tuple (int (sheet.row_values ​​(rownum) [0]), book.datemode) ValueError: недействительный литерал для int() с базой 10: '' Любые идеи относительно того, как с этим бороться? – JamesPy

+0

Это означает, что некоторые из значений, которые у вас есть, не являются датами. Я опубликовал версию 2, она должна работать. – Stanislav

+0

Благодарю вас за вашу помощь - это прекрасно. файл csv выглядит хорошо, я изменил quoting = csv.QUOTE_ALL на delimiter = ',', чтобы получить требуемый результат. Отлично! Я хочу обработать файл csv сейчас, чтобы отобразить имя человека, который находится на той же строке, что и текущая дата. Это правильный способ сделать это, или я должен импортировать данные Excel в массив вместо файла csv? Возможно, я должен написать новый вопрос. Большое вам спасибо за помощь Станислав! – JamesPy

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