【发布时间】:2014-09-28 17:29:03
【问题描述】:
我正在尝试将一个充满 XLSX 文件的目录转换为 CSV。一切正常,除了我遇到包含时间信息的列的问题。 XLSX 文件是由另一个我无法修改的程序创建的。但我想保持在 Excel 中查看 XLSX 文件时显示的时间与将其转换为 CSV 并在任何文本编辑器中查看时显示的时间相同。
我的代码:
import csv
import xlrd
import os
import fnmatch
import Tkinter, tkFileDialog, tkMessageBox
def main():
root = Tkinter.Tk()
root.withdraw()
print 'Starting .xslx to .csv conversion'
directory = tkFileDialog.askdirectory()
for fileName in os.listdir(directory):
if fnmatch.fnmatch(fileName, '*.xlsx'):
filePath = os.path.join(directory, fileName)
saveFile = os.path.splitext(filePath)[0]+".csv"
savePath = os.path.join(directory, saveFile)
workbook = xlrd.open_workbook(filePath)
sheet = workbook.sheet_by_index(0)
csvOutput = open(savePath, 'wb')
csvWriter = csv.writer(csvOutput, quoting=csv.QUOTE_ALL)
for row in xrange(sheet.nrows):
csvWriter.writerow(sheet.row_values(row))
csvOutput.close()
print '.csv conversion complete'
main()
添加一些细节,如果我在 Excel 中打开一个文件,我会在时间列中看到:
00:10.3
00:14.2
00:16.1
00:20.0
00:22.0
但在我转换为 CSV 后,我在同一位置看到了这个:
0.000118981
0.000164005
0.000186227
0.000231597
0.000254861
感谢 seanmhanson 的回答 https://stackoverflow.com/a/25149562/1858351 我能够弄清楚 Excel 将时间转储为一天的小数。虽然我应该尝试更好地学习和使用 xlrd,但为了快速进行短期修复,我能够将其转换为秒,然后从秒转换回最初看到的 HH:MM:SS 时间格式。我的(可能是丑陋的)代码如下,以防任何人都可以使用它:
import csv
import xlrd
import os
import fnmatch
from decimal import Decimal
import Tkinter, tkFileDialog
def is_number(s):
try:
float(s)
return True
except ValueError:
return False
def seconds_to_hms(seconds):
input = Decimal(seconds)
m, s = divmod(input, 60)
h, m = divmod(m, 60)
hm = "%02d:%02d:%02.2f" % (h, m, s)
return hm
def main():
root = Tkinter.Tk()
root.withdraw()
print 'Starting .xslx to .csv conversion'
directory = tkFileDialog.askdirectory()
for fileName in os.listdir(directory):
if fnmatch.fnmatch(fileName, '*.xlsx'):
filePath = os.path.join(directory, fileName)
saveFile = os.path.splitext(filePath)[0]+".csv"
savePath = os.path.join(directory, saveFile)
workbook = xlrd.open_workbook(filePath)
sheet = workbook.sheet_by_index(0)
csvOutput = open(savePath, 'wb')
csvWriter = csv.writer(csvOutput, quoting=csv.QUOTE_ALL)
rowData = []
for rownum in range(sheet.nrows):
rows = sheet.row_values(rownum)
for cell in rows:
if is_number(cell):
seconds = float(cell)*float(86400)
hms = seconds_to_hms(seconds)
rowData.append((hms))
else:
rowData.append((cell))
csvWriter.writerow(rowData)
rowData = []
csvOutput.close()
print '.csv conversion complete'
main()
【问题讨论】:
-
您是否尝试在导出之前将时间列转换为纯文本?
-
@VanCowboy 问题在于 excel 提供了基础数据的格式化视图。原始数据实际上是小数,所以我认为转换为纯文本不会解决我的问题。我在下面选择的答案更好地解释了这一点,我改变了我的代码来解决上面的问题
标签: python excel csv time xlsx