2015-03-25 17 views
5

Tôi đang cố gắng phân tích cú pháp tệp Excel.xlsx thành tệp csv. Dưới đây là file Excel:Phân tích cú pháp xlrd của Python Excel xlsx thành csv với chuyển đổi ngày

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 

My Python script:

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

tuy nhiên nó ra ngày như thế này:

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

Tôi nhận thức được chức năng xldate_as_tuple hoặc một cái gì đó như thế này để chuyển đổi đầu ra thành các giá trị có ý nghĩa nhưng tôi không thể tìm ra cách sử dụng nó. Bất kỳ trợ giúp nào tôi sẽ biết ơn nhất.

+1

Bạn dường như không * đã thử * để sử dụng 'xldate_as_tuple' - tại sao không? – jonrsharpe

+0

Tôi không biết phải đặt mã vào đâu trong mã của tôi khá đơn giản! – JamesPy

+0

Đường cong học tập cho tôi đây là ... – JamesPy

Trả lời

3

Dưới đây là một giải pháp khả thi:

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

Output:

"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:

Code:

#! /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() 

Output:

"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

Cảm ơn bạn, nhưng điều này mang lại cho tôi một lỗi: Traceback (cuộc gọi gần đây nhất): Tệp "pythonscript.py", dòng 14, trong năm, tháng, ngày, giờ, phút, giây = xlrd.xldate_as_tuple (int (sheet.row_values ​​(rownum) [0]), book.datemode) ValueError: chữ không hợp lệ cho int() với base 10: '' Bất kỳ ý tưởng nào về cách giải quyết vấn đề này? – JamesPy

+0

Điều đó có nghĩa là một số giá trị bạn có không phải là ngày. Tôi đã đăng phiên bản 2, nó sẽ hoạt động. – Stanislav

+0

Tôi cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn - điều đó thật hoàn hảo. tệp csv có vẻ tốt, tôi đã thay đổi quoting = csv.QUOTE_ALL thành delimiter = ',' để lấy kết quả mà tôi muốn. Xuất sắc! Tôi muốn xử lý tệp csv ngay bây giờ để hiển thị tên của người trên cùng một dòng với ngày hiện tại. Đây có phải là cách đúng để làm điều đó hay tôi thực sự nên nhập dữ liệu Excel vào một mảng thay vì tệp csv? Có lẽ tôi nên đăng một câu hỏi mới. Cảm ơn bạn rất nhiều vì đã giúp Stanislav !! – JamesPy

Các vấn đề liên quan