2017-09-10 7 views
0

私は自分のフォルダに1,2,3から13の名前の13のcsvファイル(1.csv、2.csv、3csvなど)を持っています。それらは1から13まで数字順で1から始まるシートで編成された単一のExcelファイル(xlsx)に!私の唯一の問題は、その私の出力であるPythonでcsvファイルをオーダーされたシートに変換する

import glob, csv, xlwt, os 
wb = xlwt.Workbook() 
for filename in glob.glob("data/*.csv"): 
    (f_path, f_name) = os.path.split(filename) 
    (f_short_name, f_extension) = os.path.splitext(f_name) 
    ws = wb.add_sheet(f_short_name) 
    spamReader = csv.reader(open(filename, 'r')) 
    for rowx, row in enumerate(spamReader): 
     for colx, value in enumerate(row): 
      ws.write(rowx, colx, value) 
wb.save("compiled.xlsx") 

:compiled.xlsxが1,2,3,4,5から始まる(私はしたい順にシートを持っていないだろう...そして、そのために私はこれを使用しました.13)、それは4,13,11,12,5,6,8などで始まります。私は望む順番で私のフォルダにファイルを持っています、私はあなたの時間のおかげで、python 3を使用して、適切なシートの順序を取得するために自分のコードを変更することができます!

+0

'glob.glob(" data/*。csv ")'を列挙する方法はありますか? 'for num、列挙するファイル名(glob.glob(" data/*。csv ")):'。それでは、 'wb.add_sheet(num + 1)'を使用する必要があります。 –

+0

sheetname = sheetname.decode(self.encoding)AttributeErrorを取得します: 'int'オブジェクトに属性 'decode'がありません –

+0

文字列 'wb.add_sheet (str(num + 1)) ' –

答えて

1

ファイル名でcsvファイルをリストにソートし、代わりにそのリストを使用できます。

すべてのファイル名をintタイプに変換できると仮定しました。

files = [os.path.split(filename) for filename in glob.glob("csvs/*.csv")] 
ordered_files = sorted(
    files, key=lambda x: int(os.path.splitext(x[1])[0]) 
) 


wb = xlwt.Workbook() 
for f_path, f_name in ordered_files: 
    (f_short_name, f_extension) = os.path.splitext(f_name) 
    ws = wb.add_sheet(f_short_name) 
    spamReader = csv.reader(open(os.path.join(f_path, f_name), 'r')) 
    for rowx, row in enumerate(spamReader): 
     for colx, value in enumerate(row): 
      ws.write(rowx, colx, value) 
wb.save("compiled.xlsx") 
+1

file_namesには何の言葉もありません –

+1

またspamReaderのファイル名= csv.reader(open(filename、 'r')) –

+0

ああ、それはうまくいくようです、ありがとう! –

関連する問題