需求背景
最近為公司開發了一套郵件日報程式,郵件一般就是表格,圖片,然後就是附件。附件一般都是預設寫到txt檔案裡,但是PM希望郵件裡的附件能直接用Excel這種軟體開啟,最開始想儲存為Excel,但是一想Excel的檔案體積會多出好多倍,csv檔案預設也是使用Excel開啟的,但是根本還是文字檔案,體積小,儲存也方便,於是最終決定使用csv模組來儲存檔案。
Python寫csv檔案
Python提供了內建模組讀寫csv檔案,這裡我只用到了寫,讀這裡就不做介紹了,也不難,主要是解決亂碼問題。
def save2csv(file_name=None, header=None, data=None): """ 儲存成CSV格式檔案,方便Excel直接開啟 :param file_name: 儲存的檔名 :param header: 表頭,每一列的名字 :param data: 具體填充資料 :return: """ if file_name is None or isinstance(file_name, basestring) is False: raise Exception('儲存CSV檔名不能為空,並且必須為字串型別') if file_name.endswith('.csv') is False: file_name += '.csv' file_obj = open(file_name, 'wb') file_obj.write(codecs.BOM_UTF8) # 防止亂碼 writer = csv.writer(file_obj) if data is None or isinstance(data, (tuple, list)) is False: raise Exception('儲存CSV檔案失敗,資料為空或者不是資料型別') if header is not None and isinstance(header, (tuple, list)) is True: writer.writerow(header) for row in data: writer.writerow(row)
注意:有三句話就是為了防止亂碼的
file_obj = open(file_name, 'wb') file_obj.write(codecs.BOM_UTF8) # 防止亂碼 writer = csv.writer(file_obj)
在檔案頭部寫入codecs.BOM_UTF8就能防止亂碼了,檔案都是utf-8編碼格式的