xlwt_Exception: Unexpected data type class 'numpy.int32'

本文介绍了一种使用Python将数据从数组写入Excel表格的方法。通过双重for循环遍历数据的行和列,将数据的每个元素转换为字符串后写入工作表。此方法适用于需要将大量数据快速导入Excel进行进一步分析或报告的场景。

for r in range(data.shape[0]):
    for c in range(data.shape[1]):
        ws_1.write(r,c,data[r,c])

solution:

for r in range(data.shape[0]):
    for c in range(data.shape[1]):
        ws_1.write(r,c,str(data[r,c]))

PS D:\vscode\python\网易云歌曲评论采集与分析> & D:/python/python3.13t.exe d:/vscode/python/网易云歌曲评论采集与分析/代码/test.py Traceback (most recent call last): File "D:\python\Lib\site-packages\numpy\_core\__init__.py", line 23, in <module> from . import multiarray File "D:\python\Lib\site-packages\numpy\_core\multiarray.py", line 10, in <module> from . import overrides File "D:\python\Lib\site-packages\numpy\_core\overrides.py", line 7, in <module> from numpy._core._multiarray_umath import ( add_docstring, _get_implementing_args, _ArrayFunctionDispatcher) ModuleNotFoundError: No module named 'numpy._core._multiarray_umath' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "D:\python\Lib\site-packages\numpy\__init__.py", line 127, in <module> from numpy.__config__ import show_config File "D:\python\Lib\site-packages\numpy\__config__.py", line 4, in <module> from numpy._core._multiarray_umath import ( ...<3 lines>... ) File "D:\python\Lib\site-packages\numpy\_core\__init__.py", line 49, in <module> raise ImportError(msg) ImportError: IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE! Importing the numpy C-extensions failed. This error can happen for many reasons, often due to issues with your setup or how NumPy was installed. We have compiled some common reasons and troubleshooting tips at: https://numpy.org/devdocs/user/troubleshooting-importerror.html Please note and check the following: * The Python version is: Python3.13 from "D:\python\python3.13t.exe" * The NumPy version is: "2.2.6" and make sure that they are the versions you expect. Please carefully study the documentation linked above for further help. Original error was: No module named 'numpy._core._multiarray_umath' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "d:\vscode\python\网易云歌曲评论采集与分析\代码\test.py", line 11, in <module> from wordcloud import WordCloud File "D:\python\Lib\site-packages\wordcloud\__init__.py", line 1, in <module> from .wordcloud import (WordCloud, STOPWORDS, random_color_func, get_single_color_func) File "D:\python\Lib\site-packages\wordcloud\wordcloud.py", line 19, in <module> import matplotlib File "D:\python\Lib\site-packages\matplotlib\__init__.py", line 161, in <module> from . import _api, _version, cbook, _docstring, rcsetup File "D:\python\Lib\site-packages\matplotlib\cbook.py", line 24, in <module> import numpy as np File "D:\python\Lib\site-packages\numpy\__init__.py", line 132, in <module> raise ImportError(msg) from e ImportError: Error importing numpy: you should not try to import numpy from its source directory; please exit the numpy source tree, and relaunch your python interpreter from there.
05-29
~/android/moscow$ python storage.py 处理目录: ./moscow 解析文件: ./moscow/03_vendor_bin.txt 解析文件: ./moscow/05_odm.txt 解析文件: ./moscow/13_my_preload_del_app_oat.txt 解析文件: ./moscow/13_my_preload_etc.txt 解析文件: ./moscow/14_data.txt 解析文件: ./moscow/13_my_preload_priv_app.txt 解析文件: ./moscow/04_product_lib.txt 解析文件: ./moscow/11_my_carrier_del_app.txt 解析文件: ./moscow/02_system_ext_media.txt 解析文件: ./moscow/02_system_priv_app_oat.txt 解析文件: ./moscow/14_data_app_oat.txt 解析文件: ./moscow/13_my_manifest_xiangxi.txt 解析文件: ./moscow/16_my_manifest_etc.txt 解析文件: ./moscow/03_vendor_firmware_mnt.txt 解析文件: ./moscow/13_my_manifest.txt 解析文件: ./moscow/02_system_app.txt 解析文件: ./moscow/07_my_engineering_media.txt 解析文件: ./moscow/02_system_etc.txt 解析文件: ./moscow/08_my_stock_priv_app_oat.txt 解析文件: ./moscow/05_odm_vendor_firmware.txt 解析文件: ./moscow/15_my_bigball_priv-app.txt 解析文件: ./moscow/03_vendor_xiangxi.txt 解析文件: ./moscow/04_product_priv_app_oat.txt 解析文件: ./moscow/03_vendor_lib.txt 解析文件: ./moscow/02_system_ext_lib.txt 解析文件: ./moscow/05_odm_lib64.txt 解析文件: ./moscow/14_data_app.txt 解析文件: ./moscow/12_my_region_app.txt 解析文件: ./moscow/02_system_lib64.txt 解析文件: ./moscow/12_my_region_priv_app.txt 解析文件: ./moscow/15_my_bigball_decouping_wallpaper.txt 解析文件: ./moscow/14_data_aee_exp.txt 解析文件: ./moscow/11_my_carrier_app_oat.txt 解析文件: ./moscow/13_my_manifest_app.txt 解析文件: ./moscow/15_my_bigball_framework.txt 解析文件: ./moscow/15_my_bigball_app.txt 解析文件: ./moscow/10_my_company_xiangxi.txt 解析文件: ./moscow/03_vendor_lib64.txt 解析文件: ./moscow/09_my_heytap_app_oat.txt 解析文件: ./moscow/07_my_engineering_app.txt 解析文件: ./moscow/03_vendor_lib_camera.txt 解析文件: ./moscow/13_my_preload_xiangxi.txt 解析文件: ./moscow/06_my_product_res.txt 解析文件: ./moscow/02_system_framework.txt 解析文件: ./moscow/04_product_priv_app.txt 解析文件: ./moscow/12_my_region_priv_app_oat.txt 解析文件: ./moscow/07_my_engineering_etc.txt 解析文件: ./moscow/06_my_product_priv_app.txt 解析文件: ./moscow/02_system_lib.txt 解析文件: ./moscow/03_vendor_lib64_camera.txt 解析文件: ./moscow/08_my_stock_del_app_oat.txt 解析文件: ./moscow/05_odm_vendor.txt 解析文件: ./moscow/06_my_product_overlay.txt 解析文件: ./moscow/07_my_engineering_decouping_wallpaper.txt 解析文件: ./moscow/12_my_region_del_app.txt 解析文件: ./moscow/06_my_product_decouping_wallpaper.txt 解析文件: ./moscow/09_my_heytap_del_app.txt 解析文件: ./moscow/10_my_company_app.txt 解析文件: ./moscow/03_vendor_euclid.txt 解析文件: ./moscow/02_system_product.txt 解析文件: ./moscow/12_my_region_del_app_oat.txt 解析文件: ./moscow/05_odm_etc.txt 解析文件: ./moscow/12_my_region_etc.txt 解析文件: ./moscow/05_odm_product_lib64.txt 解析文件: ./moscow/10_my_company.txt 解析文件: ./moscow/02_system_ext_app.txt 解析文件: ./moscow/11_my_carrier.txt 解析文件: ./moscow/02_system_fonts.txt 解析文件: ./moscow/02_system_priv-app.txt 解析文件: ./moscow/13_my_manifest_etc_camera.txt 解析文件: ./moscow/15_my_bigball.txt 解析文件: ./moscow/14_data_media_0.txt 解析文件: ./moscow/11_my_carrier_priv_app_oat.txt 解析文件: ./moscow/09_my_heytap.txt 解析文件: ./moscow/04_product_xiangxi.txt 解析文件: ./moscow/12_my_region_plugin.txt 解析文件: ./moscow/14_data_dalvik-cache_arm64.txt 解析文件: ./moscow/02_system_app_oat.txt 解析文件: ./moscow/04_product.txt 解析文件: ./moscow/13_my_preload_app.txt 解析文件: ./moscow/02_system.txt 解析文件: ./moscow/05_odm_product.txt 解析文件: ./moscow/05_odm_product_lib.txt 解析文件: ./moscow/17_cache.txt 解析文件: ./moscow/09_my_heytap_priv_app.txt 解析文件: ./moscow/15_my_bigball_del-app.txt 解析文件: ./moscow/02_system_ext_etc.txt 解析文件: ./moscow/14_data_data.txt 解析文件: ./moscow/13_my_preload_app_oat.txt 解析文件: ./moscow/07_my_engineering_overlay.txt 解析文件: ./moscow/09_my_heytap_xiangxi.txt 解析文件: ./moscow/18_lpdump.txt 解析文件: ./moscow/12_my_region_etc_camera.txt 解析文件: ./moscow/11_my_carrier_priv_app.txt 解析文件: ./moscow/15_my_bigball_del-app-pre.txt 解析文件: ./moscow/06_my_product_vendor.txt 解析文件: ./moscow/02_system_ext.txt 解析文件: ./moscow/08_my_stock_app.txt 解析文件: ./moscow/16_my_manifest.txt 解析文件: ./moscow/03_vendor_etc_camera.txt 解析文件: ./moscow/data_app.txt 解析文件: ./moscow/partitions.txt 解析文件: ./moscow/15_my_bigball_lib.txt 解析文件: ./moscow/12_my_region_media.txt 解析文件: ./moscow/02_system_ext_xiangxi.txt 解析文件: ./moscow/02_system_ext_lib64.txt 解析文件: ./moscow/06_my_product_media.txt 解析文件: ./moscow/12_my_region_app_oat.txt 解析文件: ./moscow/10_my_company_etc.txt 解析文件: ./moscow/06_my_product_etc.txt 解析文件: ./moscow/04_product_app.txt 解析文件: ./moscow/05_odm_lib.txt 解析文件: ./moscow/02_system_ext_priv_app.txt 解析文件: ./moscow/11_my_carrier_app.txt 解析文件: ./moscow/12_my_region_xiangxi.txt 解析文件: ./moscow/11_my_carrier_del_app_oat.txt 解析文件: ./moscow/13_my_preload_priv_app_oat.txt 解析文件: ./moscow/14_data_apex.txt 解析文件: ./moscow/19_uname_data.txt 解析文件: ./moscow/03_vendor_firmware_mnt_image.txt 解析文件: ./moscow/09_my_heytap_del_app_oat.txt 解析文件: ./moscow/01_mount.txt 解析文件: ./moscow/03_vendor.txt 解析文件: ./moscow/06_my_product.txt 解析文件: ./moscow/03_vendor_etc.txt 解析文件: ./moscow/08_my_stock_xiangxi.txt 解析文件: ./moscow/09_my_heytap_priv_app_oat.txt 解析文件: ./moscow/06_my_product_xiangxi.txt 解析文件: ./moscow/15_my_bigball_applist.txt 解析文件: ./moscow/14_data_del_app.txt 解析文件: ./moscow/09_my_heytap_app.txt 解析文件: ./moscow/15_my_bigball_etc.txt 解析文件: ./moscow/07_my_engineering_res.txt 解析文件: ./moscow/08_my_stock_priv_app.txt 解析文件: ./moscow/04_product_lib64.txt 解析文件: ./moscow/11_my_carrier_xiangxi.txt 解析文件: ./moscow/07_my_engineering_vendor.txt 解析文件: ./moscow/12_my_region.txt 解析文件: ./moscow/05_odm_bin.txt 解析文件: ./moscow/08_my_stock_del_app.txt 解析文件: ./moscow/04_product_app_oat.txt 解析文件: ./moscow/02_system_apex.txt 解析文件: ./moscow/02_system_xiangxi.txt 解析文件: ./moscow/05_odm_xiangxi.txt 解析文件: ./moscow/08_my_stock.txt 解析文件: ./moscow/14_data_reserve.txt 解析文件: ./moscow/03_vendor_app.txt 解析文件: ./moscow/07_my_engineering.txt 解析文件: ./moscow/13_my_preload_del_app.txt 解析文件: ./moscow/13_my_manifest_etc.txt 解析文件: ./moscow/08_my_stock_app_oat.txt 解析文件: ./moscow/06_my_product_app.txt 解析文件: ./moscow/13_my_preload.txt 解析文件: ./moscow/07_my_engineering_xiangxi.txt 解析文件: ./moscow/15_my_bigball_lib64.txt 解析文件: ./moscow/14_data_dalvik-cache.txt 处理目录: ./tacoof 解析文件: ./tacoof/03_vendor_bin.txt 解析文件: ./tacoof/05_odm.txt 解析文件: ./tacoof/13_my_preload_del_app_oat.txt 解析文件: ./tacoof/13_my_preload_etc.txt 解析文件: ./tacoof/14_data.txt 解析文件: ./tacoof/13_my_preload_priv_app.txt 解析文件: ./tacoof/04_product_lib.txt 解析文件: ./tacoof/11_my_carrier_del_app.txt 解析文件: ./tacoof/02_system_ext_media.txt 解析文件: ./tacoof/02_system_priv_app_oat.txt 解析文件: ./tacoof/14_data_app_oat.txt 解析文件: ./tacoof/13_my_manifest_xiangxi.txt 解析文件: ./tacoof/16_my_manifest_etc.txt 解析文件: ./tacoof/03_vendor_firmware_mnt.txt 解析文件: ./tacoof/13_my_manifest.txt 解析文件: ./tacoof/02_system_app.txt 解析文件: ./tacoof/07_my_engineering_media.txt 解析文件: ./tacoof/02_system_etc.txt 解析文件: ./tacoof/08_my_stock_priv_app_oat.txt 解析文件: ./tacoof/05_odm_vendor_firmware.txt 解析文件: ./tacoof/15_my_bigball_priv-app.txt 解析文件: ./tacoof/03_vendor_xiangxi.txt 解析文件: ./tacoof/04_product_priv_app_oat.txt 解析文件: ./tacoof/03_vendor_lib.txt 解析文件: ./tacoof/02_system_ext_lib.txt 解析文件: ./tacoof/05_odm_lib64.txt 解析文件: ./tacoof/14_data_app.txt 解析文件: ./tacoof/12_my_region_app.txt 解析文件: ./tacoof/02_system_lib64.txt 解析文件: ./tacoof/12_my_region_priv_app.txt 解析文件: ./tacoof/15_my_bigball_decouping_wallpaper.txt 解析文件: ./tacoof/14_data_aee_exp.txt 解析文件: ./tacoof/11_my_carrier_app_oat.txt 解析文件: ./tacoof/13_my_manifest_app.txt 解析文件: ./tacoof/15_my_bigball_framework.txt 解析文件: ./tacoof/15_my_bigball_app.txt 解析文件: ./tacoof/10_my_company_xiangxi.txt 解析文件: ./tacoof/03_vendor_lib64.txt 解析文件: ./tacoof/09_my_heytap_app_oat.txt 解析文件: ./tacoof/07_my_engineering_app.txt 解析文件: ./tacoof/03_vendor_lib_camera.txt 解析文件: ./tacoof/13_my_preload_xiangxi.txt 解析文件: ./tacoof/06_my_product_res.txt 解析文件: ./tacoof/02_system_framework.txt 解析文件: ./tacoof/04_product_priv_app.txt 解析文件: ./tacoof/12_my_region_priv_app_oat.txt 解析文件: ./tacoof/07_my_engineering_etc.txt 解析文件: ./tacoof/06_my_product_priv_app.txt 解析文件: ./tacoof/02_system_lib.txt 解析文件: ./tacoof/03_vendor_lib64_camera.txt 解析文件: ./tacoof/08_my_stock_del_app_oat.txt 解析文件: ./tacoof/05_odm_vendor.txt 解析文件: ./tacoof/06_my_product_overlay.txt 解析文件: ./tacoof/07_my_engineering_decouping_wallpaper.txt 解析文件: ./tacoof/12_my_region_del_app.txt 解析文件: ./tacoof/06_my_product_decouping_wallpaper.txt 解析文件: ./tacoof/09_my_heytap_del_app.txt 解析文件: ./tacoof/10_my_company_app.txt 解析文件: ./tacoof/03_vendor_euclid.txt 解析文件: ./tacoof/02_system_product.txt 解析文件: ./tacoof/12_my_region_del_app_oat.txt 解析文件: ./tacoof/05_odm_etc.txt 解析文件: ./tacoof/12_my_region_etc.txt 解析文件: ./tacoof/05_odm_product_lib64.txt 解析文件: ./tacoof/10_my_company.txt 解析文件: ./tacoof/02_system_ext_app.txt 解析文件: ./tacoof/11_my_carrier.txt 解析文件: ./tacoof/02_system_fonts.txt 解析文件: ./tacoof/02_system_priv-app.txt 解析文件: ./tacoof/13_my_manifest_etc_camera.txt 解析文件: ./tacoof/15_my_bigball.txt 解析文件: ./tacoof/14_data_media_0.txt 解析文件: ./tacoof/11_my_carrier_priv_app_oat.txt 解析文件: ./tacoof/09_my_heytap.txt 解析文件: ./tacoof/04_product_xiangxi.txt 解析文件: ./tacoof/12_my_region_plugin.txt 解析文件: ./tacoof/02_system_app_oat.txt 解析文件: ./tacoof/04_product.txt 解析文件: ./tacoof/13_my_preload_app.txt 解析文件: ./tacoof/02_system.txt 解析文件: ./tacoof/05_odm_product.txt 解析文件: ./tacoof/05_odm_product_lib.txt 解析文件: ./tacoof/17_cache.txt 解析文件: ./tacoof/09_my_heytap_priv_app.txt 解析文件: ./tacoof/15_my_bigball_del-app.txt 解析文件: ./tacoof/02_system_ext_etc.txt 解析文件: ./tacoof/14_data_data.txt 解析文件: ./tacoof/13_my_preload_app_oat.txt 解析文件: ./tacoof/07_my_engineering_overlay.txt 解析文件: ./tacoof/09_my_heytap_xiangxi.txt 解析文件: ./tacoof/18_lpdump.txt 解析文件: ./tacoof/12_my_region_etc_camera.txt 解析文件: ./tacoof/11_my_carrier_priv_app.txt 解析文件: ./tacoof/15_my_bigball_del-app-pre.txt 解析文件: ./tacoof/06_my_product_vendor.txt 解析文件: ./tacoof/02_system_ext.txt 解析文件: ./tacoof/08_my_stock_app.txt 解析文件: ./tacoof/16_my_manifest.txt 解析文件: ./tacoof/03_vendor_etc_camera.txt 解析文件: ./tacoof/data_app.txt 解析文件: ./tacoof/15_my_bigball_lib.txt 解析文件: ./tacoof/12_my_region_media.txt 解析文件: ./tacoof/02_system_ext_xiangxi.txt 解析文件: ./tacoof/02_system_ext_lib64.txt 解析文件: ./tacoof/06_my_product_media.txt 解析文件: ./tacoof/12_my_region_app_oat.txt 解析文件: ./tacoof/10_my_company_etc.txt 解析文件: ./tacoof/06_my_product_etc.txt 解析文件: ./tacoof/04_product_app.txt 解析文件: ./tacoof/05_odm_lib.txt 解析文件: ./tacoof/02_system_ext_priv_app.txt 解析文件: ./tacoof/11_my_carrier_app.txt 解析文件: ./tacoof/12_my_region_xiangxi.txt 解析文件: ./tacoof/11_my_carrier_del_app_oat.txt 解析文件: ./tacoof/13_my_preload_priv_app_oat.txt 解析文件: ./tacoof/14_data_apex.txt 解析文件: ./tacoof/19_uname_data.txt 解析文件: ./tacoof/03_vendor_firmware_mnt_image.txt 解析文件: ./tacoof/09_my_heytap_del_app_oat.txt 解析文件: ./tacoof/01_mount.txt 解析文件: ./tacoof/03_vendor.txt 解析文件: ./tacoof/06_my_product.txt 解析文件: ./tacoof/03_vendor_etc.txt 解析文件: ./tacoof/08_my_stock_xiangxi.txt 解析文件: ./tacoof/09_my_heytap_priv_app_oat.txt 解析文件: ./tacoof/06_my_product_xiangxi.txt 解析文件: ./tacoof/15_my_bigball_applist.txt 解析文件: ./tacoof/14_data_del_app.txt 解析文件: ./tacoof/09_my_heytap_app.txt 解析文件: ./tacoof/15_my_bigball_etc.txt 解析文件: ./tacoof/07_my_engineering_res.txt 解析文件: ./tacoof/08_my_stock_priv_app.txt 解析文件: ./tacoof/04_product_lib64.txt 解析文件: ./tacoof/11_my_carrier_xiangxi.txt 解析文件: ./tacoof/07_my_engineering_vendor.txt 解析文件: ./tacoof/12_my_region.txt 解析文件: ./tacoof/05_odm_bin.txt 解析文件: ./tacoof/08_my_stock_del_app.txt 解析文件: ./tacoof/04_product_app_oat.txt 解析文件: ./tacoof/02_system_apex.txt 解析文件: ./tacoof/02_system_xiangxi.txt 解析文件: ./tacoof/05_odm_xiangxi.txt 解析文件: ./tacoof/08_my_stock.txt 解析文件: ./tacoof/14_data_reserve.txt 解析文件: ./tacoof/03_vendor_app.txt 解析文件: ./tacoof/07_my_engineering.txt 解析文件: ./tacoof/13_my_preload_del_app.txt 解析文件: ./tacoof/13_my_manifest_etc.txt 解析文件: ./tacoof/08_my_stock_app_oat.txt 解析文件: ./tacoof/06_my_product_app.txt 解析文件: ./tacoof/15_my_bigball_plugin.txt 解析文件: ./tacoof/13_my_preload.txt 解析文件: ./tacoof/07_my_engineering_xiangxi.txt 解析文件: ./tacoof/15_my_bigball_lib64.txt 解析文件: ./tacoof/14_data_dalvik-cache.txt 创建Sheet页: 01 Traceback (most recent call last): File "storage.py", line 112, in generate_comparison_report xlwt.easyxf('font: bold on, height 280; align: wrap on, vert centre') File "/usr/lib/python2.7/dist-packages/xlwt/Worksheet.py", line 1056, in write_merge self.write(r1, c1, label, style) File "/usr/lib/python2.7/dist-packages/xlwt/Worksheet.py", line 1030, in write self.row(r).write(c, label, style) File "/usr/lib/python2.7/dist-packages/xlwt/Row.py", line 240, in write StrCell(self.__idx, col, style_index, self.__parent_wb.add_str(label)) File "/usr/lib/python2.7/dist-packages/xlwt/Row.py", line 159, in insert_cell raise Exception(msg) Exception: Attempt to overwrite cell: sheetname=u'01' rowx=0 colx=0 生成Excel文件时出错: Attempt to overwrite cell: sheetname=u'01' rowx=0 colx=0
最新发布
07-12
<think>我们遇到了一个错误:在创建名为'01'的sheet页时,尝试覆盖单元格(0,0)。这是因为在同一个sheet页中,我们可能多次尝试在同一个位置写入数据。 回顾代码:我们为每个前缀创建一个sheet页,然后在该sheet页中为每个文件创建一个表格。每个表格包括一个合并的标题行(占据0到4列)和表头行。 问题在于,当我们处理同一个sheet页中的多个文件时,我们使用一个变量`current_row`来跟踪当前写入的行。但是,在写入第一个文件后,`current_row`会递增,然后处理下一个文件时,会从新的行开始写入。所以理论上不应该覆盖。 但是,请注意错误发生在写入第一个文件的标题行时(行0,列0)。在同一个sheet页中,第一个文件写入时,`current_row`从0开始,然后写入标题行(合并单元格,位置为0行0列到0行4列),然后递增`current_row`。下一个文件会从新的行开始。 所以,为什么会出现覆盖?可能是因为在同一个sheet页中,我们处理多个文件时,每个文件都从0行开始?不,我们使用的是同一个`current_row`变量,并且每个文件都会更新它。 然而,错误信息显示是在写入第一个文件时就出错了?实际上,错误信息显示是在写入合并单元格时(`write_merge`)时,在(0,0)位置尝试写入,但是已经有一个单元格存在了。 我们再看代码:在写入合并单元格之前,我们先用`ws.write`写了5个单元格(0,0到0,4),然后紧接着又用`write_merge`覆盖了这5个单元格。这可能是导致问题的原因吗? 实际上,`write_merge`会写入一个合并的单元格,它应该覆盖之前写入的单个单元格。但是,xlwt不允许在同一个位置重复写入(即使之前写的是空值)。所以,我们之前用`ws.write`写了5个单元格,然后立即用`write_merge`写同一个区域,这就会导致冲突。 解决方案:我们不应该先写5个单元格,然后再合并。应该直接使用`write_merge`来写入标题。 修改前: ```python ws.write(current_row, 0, "文件: {}".format(filename), title_style) ws.write(current_row, 1, "", title_style) # 占位空单元格 ws.write(current_row, 2, "", title_style) ws.write(current_row, 3, "", title_style) ws.write(current_row, 4, "", title_style) # 然后 ws.write_merge(...) ``` 这会导致先写入5个单元格,然后立即尝试合并并覆盖,从而引发冲突。 修改:直接使用`write_merge`,去掉前面的5个`write`。 所以,我们将代码修改为: ```python # 合并标题单元格 ws.write_merge( current_row, current_row, 0, 4, "文件: {}".format(filename), xlwt.easyxf('font: bold on, height 280; align: wrap on, vert centre') ) current_row += 1 ``` 这样,我们只写一次,就不会有冲突了。 另外,我们还需要注意,同一个sheet页中,每个文件的表格是连续的,所以不会出现重叠。但是,每个文件表格的起始行是递增的,所以不会重叠。 因此,修改后的代码段如下: ```python # 写入文件名标题 title_style = xlwt.easyxf('font: bold on, height 280; align: wrap on, vert centre') # 合并标题单元格 ws.write_merge( current_row, current_row, 0, 4, "文件: {}".format(filename), title_style ) current_row += 1 ``` 这样修改后,应该可以避免覆盖单元格的错误。 另外,我们还需要注意,如果同一个sheet页中没有任何文件,那么就不会创建该sheet页(因为我们在循环`all_filenames`,而`all_filenames`为空则跳过)。所以不会出现空sheet页。 现在,我们修改代码并重新运行。 同时,我们还需要注意,错误信息中提到的sheet名为'01',这是因为我们提取前缀时,文件名以数字开头(如01_mount.txt),提取前缀为'01_',然后我们去掉末尾下划线得到'01'作为sheet名。 所以,修改后的代码段如下(只修改了写入标题的部分):</think>### 问题分析与解决方案 您遇到的错误是Excel单元格覆盖问题,具体原因是`write_merge()`方法在写入合并单元格时与之前写入的单元格冲突。以下是修复后的完整脚本: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- import os import re import sys import xlwt from collections import defaultdict def parse_du_file(file_path): """解析du命令输出文件""" data = {} try: with open(file_path, 'r') as f: for line in f: if 'Permission denied' in line or 'No such file' in line or not line.strip(): continue match = re.match(r'(\d+\.?\d*)\s*([KMG]?)[Bb]?\s+(.*)', line.strip()) if match: size, unit, path = match.groups() size = float(size) # 单位转换 if unit == 'M': size *= 1024 elif unit == 'G': size *= 1024*1024 elif unit == '': size = size/1024 data[path] = round(size, 2) except IOError as e: print("警告: 无法读取文件 {}: {}".format(file_path, str(e))) return data def extract_file_prefix(filename): """提取文件前缀""" match = re.match(r'^(\d+_)', filename) return match.group(1) if match else "other_" def generate_comparison_report(folder1, folder2, output_xlsx): """生成存储对比报告""" # 验证文件夹是否存在 for folder in [folder1, folder2]: if not os.path.exists(folder): print("错误: 目录不存在 - {}".format(folder)) return "目录 {} 不存在,请检查路径".format(folder) if not os.path.isdir(folder): print("错误: 路径不是目录 - {}".format(folder)) return "{} 不是有效目录".format(folder) # 初始化数据结构 machine1_data = defaultdict(dict) # {prefix: {filename: data}} machine2_data = defaultdict(dict) # 收集数据 for folder_path, data_dict in [(folder1, machine1_data), (folder2, machine2_data)]: print("处理目录: {}".format(folder_path)) try: for filename in os.listdir(folder_path): if filename.endswith('.txt'): file_path = os.path.join(folder_path, filename) print("解析文件: {}".format(file_path)) # 提取文件前缀 prefix = extract_file_prefix(filename) # 解析文件数据 file_data = parse_du_file(file_path) data_dict[prefix][filename] = file_data except OSError as e: print("目录访问错误: {}".format(str(e))) return "无法访问目录 {}: {}".format(folder_path, str(e)) # 创建Excel工作簿 try: wb = xlwt.Workbook(encoding='utf-8') header_style = xlwt.easyxf('font: bold on') title_style = xlwt.easyxf('font: bold on, height 280; align: wrap on, vert centre') normal_style = xlwt.easyxf() # 获取所有前缀并排序 all_prefixes = sorted(set(machine1_data.keys()) | set(machine2_data.keys())) # 为每个前缀创建Sheet页 for prefix in all_prefixes: # 创建Sheet页(修复名称长度问题) sheet_name = prefix.rstrip('_') # 去掉末尾下划线 if len(sheet_name) > 31: # Excel sheet名称长度限制 sheet_name = sheet_name[:31] ws = wb.add_sheet(sheet_name) print("创建Sheet页: {}".format(sheet_name)) # 当前行指针 current_row = 0 # 获取当前前缀下的所有文件名 all_filenames = sorted( set(machine1_data.get(prefix, {}).keys()) | set(machine2_data.get(prefix, {}).keys()) ) # 为每个文件创建独立表格 for filename in all_filenames: # 修复:直接使用write_merge,避免先写单元格再合并 ws.write_merge( current_row, current_row, 0, 4, "文件: {}".format(filename), title_style ) current_row += 1 # 写入表头 headers = ['路径', '机器1大小(KB)', '机器2大小(KB)', '差值(KB)', '差异百分比(%)'] for col, header in enumerate(headers): ws.write(current_row, col, header, header_style) current_row += 1 # 获取文件数据 data1 = machine1_data.get(prefix, {}).get(filename, {}) data2 = machine2_data.get(prefix, {}).get(filename, {}) all_paths = sorted(set(data1.keys()) | set(data2.keys())) # 写入数据行 for path in all_paths: size1 = data1.get(path, 0.0) size2 = data2.get(path, 0.0) diff = size2 - size1 if size1 != 0: diff_pct = (diff / size1) * 100 else: diff_pct = float('inf') if diff != 0 else 0.0 # 写入行数据 ws.write(current_row, 0, path, normal_style) ws.write(current_row, 1, size1, normal_style) ws.write(current_row, 2, size2, normal_style) ws.write(current_row, 3, diff, normal_style) ws.write(current_row, 4, diff_pct, normal_style) current_row += 1 # 添加两个空行分隔表格 current_row += 2 # 保存文件 wb.save(output_xlsx) return "对比报告已成功生成: {}".format(output_xlsx) except Exception as e: import traceback traceback.print_exc() return "生成Excel文件时出错: {}".format(str(e)) if __name__ == "__main__": # 使用当前目录下的相对路径 report = generate_comparison_report( folder1='./moscow', # 当前目录下的moscow文件夹 folder2='./tacoof', # 当前目录下的tacoof文件夹 output_xlsx='file_prefix_compare.xlsx' ) print(report) ``` ### 关键修复点: 1. **单元格写入冲突修复**: ```python # 修复前(错误写法) ws.write(current_row, 0, "文件: {}".format(filename), title_style) ws.write(current_row, 1, "", title_style) ws.write_merge(...) # 导致单元格覆盖冲突 # 修复后(正确写法) ws.write_merge( current_row, current_row, 0, 4, "文件: {}".format(filename), title_style ) ``` 2. **sheet名称长度限制**: ```python sheet_name = prefix.rstrip('_') # 去掉末尾下划线 if len(sheet_name) > 31: # Excel sheet名称长度限制 sheet_name = sheet_name[:31] # 截断过长的名称 ``` 3. **样式优化**: ```python # 预定义样式避免重复创建 title_style = xlwt.easyxf('font: bold on, height 280; align: wrap on, vert centre') header_style = xlwt.easyxf('font: bold on') normal_style = xlwt.easyxf() ``` ### 错误原因分析: 1. **原始错误信息**: ``` Exception: Attempt to overwrite cell: sheetname=u'01' rowx=0 colx=0 ``` 2. **根本原因**: - 先使用`ws.write()`在(0,0)位置写入了单元格 - 再使用`write_merge()`尝试覆盖同一个位置的单元格 - xlwt库不允许这种覆盖操作,导致异常 3. **解决方案**: - 直接使用`write_merge()`一次性写入合并单元格 - 避免先写入单个单元格再尝试合并 ### 使用说明: 1. 将修复后的脚本保存为`fixed_storage.py` 2. 确保`moscow`和`tacoof`目录存在且包含数据文件 3. 运行命令: ```bash python fixed_storage.py ``` 4. 输出文件`file_prefix_compare.xlsx`将包含: - 每个数字前缀一个Sheet页(01, 02, 03等) - 每个文件一个独立表格 - 所有路径和大小对比数据 ### 预期输出结构示例: **Sheet: 01** ``` | 文件: 01_mount.txt | (合并单元格) | |---------------------------------|-------------| | 路径 | 机器1大小 | 机器2大小 | 差值 | 差异% | | /system/bin/mount| 120.0 | 125.0 | 5.0 | 4.17% | | ... | ... | ... | ... | ... | ``` **Sheet: 02** ``` | 文件: 02_system.txt | (合并单元格) | |---------------------------------|-------------| | 路径 | 机器1大小 | 机器2大小 | 差值 | 差异% | | /system/bin/sh | 80.0 | 80.0 | 0.0 | 0.0% | | ... | ... | ... | ... | ... | ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LIQING LIN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值