【问题标题】:Python xlrd parse Excel xlsx to csv with date conversionPython xlrd 使用日期转换将 Excel xlsx 解析为 csv
【发布时间】:2015-05-29 02:37:35
【问题描述】:

我正在尝试将 Excel.xlsx 文件解析为 csv 文件。这是 Excel 文件:

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 函数或类似的函数可以将输出转换为有意义的值,但我不知道如何使用它。 任何帮助我将不胜感激。

【问题讨论】:

  • 您似乎没有尝试使用xldate_as_tuple - 为什么不呢?
  • 嗯,日期在哪里?你看过sheet.row_values(rownum)吗?您知道它是什么,以及如何访问其中的各个值吗?你有没有学习过不错的 Python 教程?
  • 这不是真正的xlrd 问题!您已成功使用xlrd 为您获取该行中的对象序列,现在您只需要处理它们。
  • 现在你到了某个地方!
  • 对!到时候我会做一些研究。谢谢你:)

标签: python python-2.7 csv xlrd


【解决方案1】:

这是一种可能的解决方案:

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 "

版本2:

代码:

#! /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 "

【讨论】:

  • 谢谢,但这给了我一个错误: Traceback(最近一次调用最后一次):文件“pythonscript.py”,第 14 行,在 年、月、日、小时、分钟, sec = xlrd.xldate_as_tuple(int(sheet.row_values(rownum)[0]), book.datemode) ValueError: invalid literal for int() with base 10: '' 关于如何处理这个有什么想法吗?
  • 这意味着您拥有的某些值不是日期。我已经发布了第 2 版,它应该可以工作。
  • 非常感谢您的帮助 - 这是完美的。 csv 文件看起来不错,我将 quoting=csv.QUOTE_ALL 更改为 delimiter=',' 以获得我想要的输出。优秀!我现在想处理 csv 文件以显示与当前日期在同一行的人的姓名。这是正确的方法还是我应该将 Excel 数据真正导入数组而不是 csv 文件?也许我应该发布一个新问题。非常感谢斯坦尼斯拉夫的帮助!!
  • 我不确定您要达到的目标。我认为这可以工作。因为这是一个不同的问题,所以发布一个新问题会很好。
  • 我有其他人制作的 rota (Excel rota.xlsx)。名单告诉我谁在给定日期负责某项工作(名单中的第 1 列),我想从 rota.xlsx 中获取数据,并通过电子邮件向第 1 列中的人发送电子邮件以提醒他们这是他们的一天做这项工作。于是我解析了 rota.xlsx,然后找到当前日期列出的 person 1,然后发邮件提醒他们。我想在一个脚本中完成这一切...我会考虑如何将其作为一个适当的问题发布?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 2018-08-27
  • 1970-01-01
  • 2014-05-06
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多