【发布时间】:2012-11-02 01:45:52
【问题描述】:
我遇到了一个问题,我在 .xls 文件中有一些数据(下面的示例)。
A B C D E F
John Smith 8:00AM 9:00AM 10:00AM 5:00PM 8.00
当我使用 Python CSV 模块将其写入 csv 时,结果为
John,Smith,0.333333333,0.375,0.416666667,0.708333333,0.333333333
现在有趣的部分是,如果我手动将 xls 文件保存为 MSDOS csv,我会得到所需的输出
John,Smith,8:00 AM,9:00 AM,10:00 AM,5:00 PM,8:00
这是我正在运行的函数。它有点混乱,所以我提前道歉。
def csv_gen(filepath, saveto):
for files in glob.glob("*.xls"):
shutil.copy(filepath + "\\" + files, saveto)
with xlrd.open_workbook(files) as wb:
sh = wb.sheet_by_index(0)
newfile = saveto + files[:-4] + '.csv'
now = datetime.datetime.now()
dates = now.strftime("%m-%d-%Y")
filestart = [saveto + files]
time = [dates]
with open(newfile, 'wb') as f:
c = csv.writer(f,delimiter=',')
list = range(sh.nrows)
last = range(sh.nrows)[-1]
list.remove(0)
list.remove(3)
list.remove(2)
list.remove(1)
list.remove(last)
#Iterate through data and show values of the rows
for r in list:
lines = sh.row_values(r)
del lines[:4]
stuff = lines + filestart + time
#Remove blanks so csv doesnt have uneeded data
if lines[0] is '':
del stuff[:]
#Write to csv file with new data
if any(field.strip() for field in stuff):
c.writerow(stuff)
shutil.move(newfile, mergeloc)
我不明白为什么会这样。我已经尝试将方言标志添加到 csv 编写器为“excel”,但输出仍然相同。
更新:
如果我将文档保存为 csv,那么workBook.SaveAs(test.csv, 24) 编码 24 用于 MSDOS。我得到了所需的
John,Smith,8:00 AM,9:00 AM,10:00 AM,5:00 PM,8:00
但是当 csv 模块抓取它并删除一些空白行并在最后删除一些东西时,它会写出这些行,这就是我再次得到小数的时候
John,Smith,0.333333333,0.375,0.416666667,0.708333333,0.333333333
csv 模块的目的是修改行和删除空白行。
更新
for r in list:
cells = sh.row_values(r)
csv_row = cells[0] for col_value in cells[1:]:
csv_row.append(datetime.time(*xlrd.xldate_as_tuple(col_value, 0)[3:]))
添加了 row_values 以仅返回单元格的值,而不是 xldata:0.33333。然后添加一个 * 以使传递成为位置参数。
【问题讨论】:
-
请不要使用
list作为变量名。这很令人困惑...... -
对,我正在使用 xls 并转换为 csv 文件。他们使用它来跟踪个人的时间,然后我通过 csv 文件导入数据,因为我需要一个分隔文件
-
我尝试这样做:
import datetime; now = datetime.datetime.now(); dates = now.strftime("%m-%d-%Y"); time = [dates]; print time我得到['11-13-2012']这是您期望的时间吗? -
抱歉,now = datetime.datetime.now() dates = now.strftime("%m-%d-%Y") 用于稍后在代码中附加另一列日期。
-
如果您在
lines = sh.row_values(r)之后立即调用print lines,它会输出什么?你从sh.cell_type(0,1)得到什么,或者你的第一个数据行的索引是什么,很难告诉你从工作表的开头删除一些行?