影刀RPA 数据导出多格式:Excel、CSV、TXT、JSON的互相转换
影刀RPA 数据导出多格式Excel、CSV、TXT、JSON的互相转换作者林焱采集到的数据最终要导出成文件给别人用。但不同的人需要不同的格式——财务要Excel、开发要JSON、数据分析要CSV、有时候还要TXT。如果你的流程只能导出一种格式每次换需求就得改代码。这篇文章把Excel、CSV、TXT、JSON四种格式之间的互相转换方法讲全做成通用模板。一、格式特性对比格式优势劣势适用场景Excel有格式、有公式、通用文件大、需要库报表、财务CSV简单、通用、小无类型、无格式数据交换、导入导出TXT最简单、可读无结构日志、简单文本JSON有结构、支持嵌套比CSV冗余API、配置、嵌套数据二、数据从Excel导出2.1 Excel转CSVimportpandasaspd# 读取Exceldfpd.read_excel(D:\\data\\products.xlsx)# 写入CSVUTF-8 with BOMExcel打开不乱码df.to_csv(D:\\data\\products.csv,indexFalse,encodingutf-8-sig)# 指定分隔符df.to_csv(D:\\data\\products.tsv,indexFalse,sep\t,encodingutf-8-sig)坑Excel多Sheet转CSVCSV只能存一个SheetExcel多Sheet需要逐个转换xlpd.ExcelFile(D:\\data\\multi_sheet.xlsx)forsheet_nameinxl.sheet_names:dfxl.parse(sheet_name)df.to_csv(fD:\\data\\{sheet_name}.csv,indexFalse,encodingutf-8-sig)2.2 Excel转JSON拼多多店群自动化报活动上架importpandasaspdimportjson dfpd.read_excel(D:\\data\\products.xlsx)# 转成JSON记录格式datadf.to_dict(records)withopen(D:\\data\\products.json,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse,indent2)# JSON格式示例# [# {商品名: 苹果, 价格: 5.0, 库存: 100},# {商品名: 香蕉, 价格: 3.5, 库存: 200}# ]2.3 Excel转TXTimportpandasaspd dfpd.read_excel(D:\\data\\products.xlsx)# 用制表符分隔withopen(D:\\data\\products.txt,w,encodingutf-8)asf:# 写表头f.write(\t.join(df.columns)\n)# 写数据for_,rowindf.iterrows():f.write(\t.join(str(v)forvinrow)\n)三、数据从CSV导出3.1 CSV转Excelimportpandasaspd dfpd.read_csv(D:\\data\\products.csv,encodingutf-8-sig)df.to_excel(D:\\data\\products.xlsx,indexFalse)3.2 CSV转JSONimportpandasaspdimportjson dfpd.read_csv(D:\\data\\products.csv,encodingutf-8-sig)datadf.to_dict(records)withopen(D:\\data\\products.json,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse,indent2)3.3 CSV转TXTimportpandasaspd dfpd.read_csv(D:\\data\\products.csv,encodingutf-8-sig)withopen(D:\\data\\products.txt,w,encodingutf-8)asf:f.write(\t.join(df.columns)\n)for_,rowindf.iterrows():f.write(\t.join(str(v)forvinrow)\n)四、数据从JSON导出4.1 JSON转Excelimportpandasaspdimportjsonwithopen(D:\\data\\products.json,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.to_excel(D:\\data\\products.xlsx,indexFalse)坑嵌套JSON转Excel# 嵌套JSONdata[{name:商品A,info:{price:10,stock:100}},{name:商品B,info:{price:20,stock:200}},]# 直接转DataFrame会把info列变成字典dfpd.DataFrame(data)# info列的值是 {price: 10, stock: 100}# 展开嵌套dfpd.json_normalize(data)# 列变成 name, info.price, info.stock4.2 JSON转CSVimportpandasaspdimportjsonwithopen(D:\\data\\products.json,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.to_csv(D:\\data\\products.csv,indexFalse,encodingutf-8-sig)4.3 JSON转TXTimportjsonwithopen(D:\\data\\products.json,r,encodingutf-8)asf:datajson.load(f)withopen(D:\\data\\products.txt,w,encodingutf-8)asf:foritemindata:line | .join(f{k}:{v}fork,vinitem.items())f.write(line\n)五、通用转换函数importpandasaspdimportjsonimportosfromdatetimeimportdatetimedefconvert_data(data,output_path,formatNone): 通用数据导出函数 参数 - data: 数据字典列表或DataFrame - output_path: 输出文件路径 - format: 强制指定格式excel, csv, json, txt 如果不指定根据文件扩展名自动判断 # 确定格式ifformatisNone:extos.path.splitext(output_path)[1].lower()format_map{.xlsx:excel,.xls:excel,.csv:csv,.json:json,.txt:txt,}formatformat_map.get(ext,csv)# 转成DataFrameifisinstance(data,list):dfpd.DataFrame(data)elifisinstance(data,pd.DataFrame):dfdataelifisinstance(data,dict):dfpd.DataFrame([data])else:raiseValueError(不支持的数据类型)# 确保目录存在os.makedirs(os.path.dirname(output_path),exist_okTrue)# 按格式导出ifformatexcel:df.to_excel(output_path,indexFalse)elifformatcsv:df.to_csv(output_path,indexFalse,encodingutf-8-sig)elifformatjson:data_listdf.to_dict(records)withopen(output_path,w,encodingutf-8)asf:json.dump(data_list,f,ensure_asciiFalse,indent2)elifformattxt:withopen(output_path,w,encodingutf-8)asf:f.write(\t.join(df.columns)\n)for_,rowindf.iterrows():f.write(\t.join(str(v)forvinrow)\n)else:raiseValueError(f不支持的格式{format})print(f导出成功{output_path}{len(df)}行)returnoutput_pathdefmulti_format_export(data,base_path,formatsNone): 同时导出多种格式 参数 - data: 数据 - base_path: 基础路径不含扩展名 - formats: 格式列表如 [excel, csv, json] ifformatsisNone:formats[excel,csv,json]ext_map{excel:.xlsx,csv:.csv,json:.json,txt:.txt,}exported_files[]forfmtinformats:output_pathbase_pathext_map.get(fmt,.csv)convert_data(data,output_path,formatfmt)exported_files.append(output_path)returnexported_files# 使用示例 # 采集的数据collected_data[{id:1,name:商品A,price:10.0,stock:100},{id:2,name:商品B,price:20.0,stock:200},{id:3,name:商品C,price:30.0,stock:300},]# 单格式导出convert_data(collected_data,D:\\output\\products.xlsx)# 多格式同时导出multi_format_export(collected_data,D:\\output\\products_20260701,formats[excel,csv,json,txt])六、读取任意格式defload_data(filepath,formatNone): 通用数据读取函数 支持Excel、CSV、JSON、TXT ifformatisNone:extos.path.splitext(filepath)[1].lower()format_map{.xlsx:excel,.xls:excel,.csv:csv,.json:json,.txt:txt,}formatformat_map.get(ext,csv)ifformatexcel:returnpd.read_excel(filepath).to_dict(records)elifformatcsv:returnpd.read_csv(filepath,encodingutf-8-sig).to_dict(records)elifformatjson:withopen(filepath,r,encodingutf-8)asf:returnjson.load(f)elifformattxt:# 假设是制表符分隔returnpd.read_csv(filepath,sep\t,encodingutf-8).to_dict(records)else:raiseValueError(f不支持的格式{format})# 使用dataload_data(D:\\data\\products.xlsx)dataload_data(D:\\data\\products.csv)dataload_data(D:\\data\\products.json)七、实战场景7.1 采集后多格式导出# 1. 采集数据collected_datacollect_all_pages()# 2. 生成带日期的文件名todaydatetime.now().strftime(%Y%m%d)base_pathfD:\\output\\collection_{today}[video(video-ZYWaRJzx-1784264448979)(type-csdn)(url-https://live.csdn.net/v/embed/526817)(image-https://v-blog.csdnimg.cn/asset/1d3c3709da119dd8c13ab01e9b282520/cover/Cover0.jpg)(title-TEMU店群矩阵自动化运营核价报活动)]# 3. 同时导出Excel和CSVmulti_format_export(collected_data,base_path,formats[excel,csv])# 4. 额外导出JSON给API用convert_data(collected_data,base_path.json)7.2 格式批量转换importosfrompathlibimportPath# 把目录下所有Excel转成CSVinput_dirD:\\data\\excel_filesoutput_dirD:\\data\\csv_filesos.makedirs(output_dir,exist_okTrue)forfilepathinPath(input_dir).glob(*.xlsx):dfpd.read_excel(filepath)csv_pathos.path.join(output_dir,filepath.stem.csv)df.to_csv(csv_path,indexFalse,encodingutf-8-sig)print(f{filepath.name}→{filepath.stem}.csv)7.3 带格式的Excel导出defexport_formatted_excel(data,filepath):导出带格式的Exceldfpd.DataFrame(data)df.to_excel(filepath,indexFalse)# 用openpyxl加格式importopenpyxlfromopenpyxl.stylesimportFont,PatternFill,Alignment wbopenpyxl.load_workbook(filepath)wswb.active# 表头格式forcolinrange(1,ws.max_column1):cellws.cell(row1,columncol)cell.fontFont(boldTrue,colorFFFFFF)cell.fillPatternFill(start_color4472C4,end_color4472C4,fill_typesolid)cell.alignmentAlignment(horizontalcenter)# 自适应列宽fromopenpyxl.utilsimportget_column_letterforcolinrange(1,ws.max_column1):max_len0forrowinrange(1,ws.max_row1):valws.cell(rowrow,columncol).valueifval:lengthsum(2iford(c)127else1forcinstr(val))max_lenmax(max_len,length)ws.column_dimensions[get_column_letter(col)].widthmax_len4# 冻结首行ws.freeze_panesA2wb.save(filepath)print(f格式化Excel导出完成{filepath})八、避坑清单坑1CSV中文乱码Excel打开UTF-8编码的CSV会乱码。用utf-8-sig编码写入带BOM头。坑2JSON中文被转义json.dump默认把中文转义成\uXXXX。设置ensure_asciiFalse。坑3Excel数字精度丢失Excel单元格默认15位有效数字超过的会变成0。长数字ID需要以文本格式存储df[ID]df[ID].astype(str)# 转成字符串坑4CSV中逗号冲突数据中包含逗号会导致CSV列错位。pandas的to_csv自动用引号包裹包含逗号的字段。坑5大数据导出内存不足几百万行数据一次性导出可能内存不足。分批导出# 分批写入CSVforiinrange(0,len(data),10000):batchdata[i:i10000]dfpd.DataFrame(batch)df.to_csv(output.csv,modea,header(i0),indexFalse,encodingutf-8-sig)