【问题标题】:Is there a way to deal with cell size when using python pandas.read_excel function?使用 python pandas.read_excel 函数时有没有办法处理单元格大小?
【发布时间】:2021-03-15 21:16:41
【问题描述】:

现在,我正在尝试运行一个简单的代码,该代码循环遍历数千个 Excel 工作表并提取数据。我将 Python 3.7 与 Pandas 和 Glob 包一起使用。代码很简单,如下图:

for fname in glob.glob(path):
   df = pd.read_excel(fname, index_col=None, header=None)

但是,这给了我一个类型错误。 TypeError: Fill() takes no arguments

话虽如此,我发现问题出在 Excel 工作表中的时间戳格式。在这种情况下,列宽太小,所以 excel 返回“#####”;但是,当我扩展单元格宽度并重新保存文件时,代码运行得非常好。我还附上了一张 Excel 表格的图片(Excel Example)。还附上了一张扩展单元格宽度的图片 (Extended Cell Width)。

很遗憾,我无法手动完成此编辑。有没有人有处理这个问题的经验?

提前致谢, 丹

使用 Excel 文件信息更新: 文件扩展名:“.xlsx” 链接:Link to Excel File

【问题讨论】:

  • 您能否提供一个包含错误的 xml 文件以便我们下载?您的示例图像很好,但我尝试复制它并没有遇到任何问题,我们真的需要一个 xml。另外:你的excel文件的扩展名是什么(有很多多余的excel扩展名)?
  • 抱歉,我对编码比较陌生,但是由于 excel 文件没有任何映射,因此无法转换为 xml。如果网站允许,我很乐意提供该文件的链接。此外,文件扩展名为“.xlsx”
  • 不用道歉,我们都很好。随便尝试帮助人们。 ;)
  • 嗯。尝试安装 xlrd 和 openpyxl。但是,是的,欢迎提供文件。
  • 作为土木工程师(几乎没有编码经验),我感谢您愿意提供帮助!我相信您要查找的所有信息都已上传。

标签: python-3.x excel pandas dataframe


【解决方案1】:

可行但不安全的解决方案

您可以使用旧版本的xlrd

#In your cmd:
pip install xlrd=1.2.0

那么……

pandas.read_excel('your_file_path', engine='xlrd')

但请先阅读下面的警告,您必须相信您的数据是安全的。如果您知道您使用的数据来自可信赖的来源,您可以使用它,只要您的 xlrd 版本在虚拟环境中(请参阅 anaconda),这样您就不会使用它来错误地打开不安全的文件 2 年下线。

观察

我复制了操作的错误。这是我发现的: 我和op都按照说明安装了openpyxl

# Welcome inside of the openpyxl code base! Let's find that bug!
def _convert(expected_type, value):
    """
    Check value is of or can be converted to expected type.
    """
    if not isinstance(value, expected_type):
        try:
            # ERROR TRIGGERED HERE!
            value = expected_type(value) 
        except:
            raise TypeError('expected ' + str(expected_type))
    return value

这里的expected_type()可以是浮点数或者日期时间,比如

value = expected_type(value) # Before
value = float(value)         # After

但我们得到的是<class 'openpyxl.styles.fills.Fill'> 所以它尝试像这样转换值:

value = <class 'openpyxl.styles.fills.Fill'>(value)

这毫无意义! >:(

似乎openpyxl 正在读取列宽,发现列太小而无法显示值。因此,它使用 FILL 方法用“XXXX”填充空间以表示空间不足...

什么不起作用:

  • 设置usecols 参数以避免加载日期列
  • 设置dtype参数强制类型为str
  • 尝试使用 openpyxl 转换文件

以下转换失败:

workbook = openpyxl.load_workbook(r'X:...\Cycle120.xlsx')
workbook.save(r'X:...\OUTPUT.xls')
# Same error... value = expected_type(value)
# TypeError: Fill() takes no arguments

警告

不要切换旧的xlrd(引擎)版本来读取您的 xlsx 文件。旧引擎存在安全问题!

xlsx 支持被删除的原因是因为它有潜力 安全漏洞,没有人维护它。如果你选择 这种方法,而不是简单地切换到 openpyxl,你是 冒着接触这些的风险。

见:Pandas cannot open an Excel (.xlsx) file

【讨论】:

  • 弗洛里安,谢谢。我同意并且不认为显示器应该是一个问题。我只是不明白为什么扩展/重新保存过程会解决问题!
  • 扩展/重新保存?我从来没有问过也没有建议过。我要你的真实文件。至少有一条线失败了。我还想知道扩展类型“myfile.xlsx”或“myfile.xls”。另外,你的熊猫是什么版本的?
  • 这似乎是 openpyxl 的一个错误,它试图用...读取列,但我们想要一个日期。更改 pandas.read_excel engine= ... 可能会有所帮助,我正在努力! :)
  • 使用 xlrd 效果很好。我之前也没有使用过venv,所以我能够一次学习两个新东西!再次感谢弗洛里安。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2017-10-01
  • 2018-02-03
  • 2023-02-10
  • 1970-01-01
相关资源
最近更新 更多