.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:]))
xldata:0.33333 ではなくセルの値を返すように、row_values を追加しました。次に、パスを位置引数にするために * を追加しました。