3

.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 を追加しました。次に、パスを位置引数にするために * を追加しました。

4

1 に答える 1

2

それは私にはモジュールの問題のようには見えません。ファイルcsvの読み取りで何か問題が発生しているようです。.xls

xlrd ドキュメントによると、Excelワークシートの日付はかなりひどい混乱です

Excel スプレッドシートの日付

実際には、そのようなことはありません。あなたが持っているのは、浮動小数点数と敬虔な希望です。Excel の日付にはいくつかの問題があります。

.xlsあなたが提供した内容を含む新しいファイルで簡単なテストを行いました。私のマシンにはExcelがありませんが、Pythonはファイルの読み取りに問題はありません.LibreOfficeでファイルを作成し、.xlsとして保存しました。それでも、フィールドは Python 側で Unicode 文字列として出力されます。

xlrd.xldate_as_tuple(xldate, datemode)(リンク) を使用して、フロートを Python 日付タプルに変換できるはずです。やっている

print xlrd.xldate_as_tuple(0.333333333,0)

プリントアウト

(0, 0, 0, 8, 0, 0)

アップデート

したがって、おそらく次のようなものが必要forで、行を超えるループを変更します

...
for r_idx in list:
    cells = sh.row(r)
    csv_row = [cells[0]] # the first row value should be ok as just a string
    for col_value in cells[1:]:
        # add the date time column values to the converted csv row
        csv_row.append( datetime.time(xlrd.xldate_as_tuple(col_value, 0)[3:]) )
    ...
于 2012-11-13T16:14:46.533 に答える