迭代 openpyxl 中的只读工作簿中的列

2024-01-03

我有一个有点大的 .xlsx 文件 - 19 列,5185 行。我想打开文件,读取一列中的所有值,对这些值执行一些操作,然后在同一工作簿中创建一个新列并写出修改后的值。因此,我需要能够在同一个文件中读取和写入。

我原来的代码是这样做的:

def readExcel(doc):
    wb = load_workbook(generalpath + exppath + doc)
    ws = wb["Sheet1"]

    # iterate through the columns to find the correct one
    for col in ws.iter_cols(min_row=1, max_row=1):
        for mycell in col:
            if mycell.value == "PerceivedSound.RESP":
                origCol = mycell.column

    # get the column letter for the first empty column to output the new values
    newCol = utils.get_column_letter(ws.max_column+1)

    # iterate through the rows to get the value from the original column,
    # do something to that value, and output it in the new column
    for myrow in range(2, ws.max_row+1):
        myrow = str(myrow)
        # do some stuff to make the new value
        cleanedResp = doStuff(ws[origCol + myrow].value)
        ws[newCol + myrow] = cleanedResp

    wb.save(doc)

然而,由于工作簿太大,Python 在第 3853 行之后抛出了内存错误。 openpyxl 文档说使用只读模式(https://openpyxl.readthedocs.io/en/latest/optimized.html https://openpyxl.readthedocs.io/en/latest/optimized.html)来处理大型工作簿。我现在正在尝试使用它;但是,当我添加 read_only = True 参数时,似乎无法迭代列:

def readExcel(doc):
    wb = load_workbook(generalpath + exppath + doc, read_only=True)
    ws = wb["Sheet1"]

    for col in ws.iter_cols(min_row=1, max_row=1):
        #etc.

python 抛出这个错误:AttributeError:“ReadOnlyWorksheet”对象没有属性“iter_cols”

如果我将上面代码片段中的最后一行更改为:

for col in ws.columns:

python 抛出同样的错误:AttributeError:“ReadOnlyWorksheet”对象没有属性“columns”

迭代行很好(并且包含在我上面链接的文档中):

for col in ws.rows:

(没有错误)

这个问题 https://stackoverflow.com/questions/45220078/attributeerror-with-openpyxl询问 AttritubeError 但解决方案是删除只读模式,这对我不起作用,因为 openpyxl 在非只读模式下不会读取我的整个工作簿。

那么:如何迭代大型工作簿中的列?

我还没有遇到过这种情况,但一旦我可以迭代这些列,我就会遇到这种情况:如果所述工作簿很大,我如何读取和写入同一工作簿?

Thanks!


如果工作表只有大约 100,000 个单元格,那么您应该不会有任何内存问题。您可能应该进一步调查这一点。

iter_cols()在只读模式下不可用,因为它需要不断且非常低效地重新解析底层 XML 文件。然而,将行转换为列相对容易iter_rows() using zip.

def _iter_cols(self, min_col=None, max_col=None, min_row=None,
               max_row=None, values_only=False):
    yield from zip(*self.iter_rows(
        min_row=min_row, max_row=max_row,
        min_col=min_col, max_col=max_col, values_only=values_only))

import types
for sheet in workbook:
    sheet.iter_cols = types.MethodType(_iter_cols, sheet)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代 openpyxl 中的只读工作簿中的列 的相关文章

随机推荐

  • 并行动态规划

    有没有讨论如何采用动态程序并将其并行化的好论文 我们最近发表了一篇论文 展示了如何通过共享无锁哈希表在共享内存多核计算机上并行化任何动态编程 Stivala A 和 Stuckey P J 和 Garcia de la Banda M 和
  • 使用 bazel 覆盖率生成 lcov 覆盖率文件时,未创建输出“_coverage/_coverage_report.dat”

    我正在使用 bazel 来管理我们的 golang 项目 我在网上找到了一个选项 我可以通过先生成 lcovcoverage dat 文件来生成覆盖率 html 文件 然后使用 genhtml 生成 html 然而 我却无法成功迈出第一步
  • 确定单元格是否通过 Excel 中的 VBA 链接到查询表

    我使用 QueryTables 将 Excel 工作表链接到数据源 效果很好 我想引入逻辑来检查给定单元格并确定该单元格是否是现有查询表的左上角 这在概念上似乎微不足道 但在实践中却被证明是难以捉摸的 如果我尝试检查与 QueryTable
  • 安卓。警报管理器在奇怪的时间触发

    我使用以下代码设置重复闹钟 每 5 分钟一次 public void SetAlarm Context context AlarmManager am AlarmManager context getSystemService Contex
  • 将列更改为默认 SYSDATE 的 DATE 的 SQL 语句(Oracle)是什么?

    我得到了一个表名 kundorder 和列名称 datum 我想将数据类型更改为 DATE SYSDATE 但我无法让它工作 我认为它应该看起来像这样 ALTER TABLE kundorder MODIFY datum DATE DEFA
  • 在 iFrame 中使用 Google 云端硬盘不起作用

    我在 iFrame 中使用 Google Drive 时遇到了一些问题 通常 在 iFrame 中使用它无论如何都不是一个好主意 但这是为了教学 Google Drive 学生可以编写一些代码 然后他们可以预览它 预览需要在 iFrame
  • 在 Uint8Array 中搜索多字节模式

    我有一个 nodejs 脚本 我想在其中解析 MP3 帧 这些帧很容易检测 因为每个帧都以两个字节开头0xff 0xfb 我正在使用一个Uint8Array访问该文件的字节 使用 indexOf call data 0xff 我可以轻松搜索
  • IE 中的 Google Maps API v3 不显示地图或标记

    我们最近从 Google 地图 v2 升级到 v3 现在标记和地图将不会在任何版本的 IE 中显示 它适用于所有其他浏览器 控制台显示 Stack Overflow 错误 我们认为这与标记和 或标记的创建有关 我们禁用了 fitbounds
  • Numpy where 返回空数组

    我有一个数组 例如 a 5 1 3 0 2 我应用 where 函数 np where a 2 输出是一个空数组 array dtype int64 我发现了同样的问题here https stackoverflow com questio
  • Visual Studio 2015 - 连接到 Visual Studio 库进行扩展和更新时出现 Visual Studio 库错误

    当尝试从扩展和更新获取 Visual Studio 扩展时 我收到以下错误 向 Visualstudiogallery msdn microsoft com Services VStudio Extension svc 发出 HTTP 请求
  • 如何在单文件组件中使用 VueJS 2 全局组件?

    我正在尝试使用全局注册的组件 带有Vue 组件 在单个文件组件中但我总是得到 vue common js 2611 Vue warn Unknown custom element
  • 如何使用 System.Text.Json 将 double[] 二维数组序列化为 JSON?

    我需要写一个double 使用 System Text Json 转换为 JSON 文件 但此序列化程序不支持二维数组 我需要一些帮助来转换我的double to a List
  • PyPy 中的 GIL 在哪里?

    PyPy GIL 是 RPython 中 PyPy 解释器实现的一部分 还是 translate py 自动添加的东西 也就是说 如果我用 RPython 编写自己的新语言解释器并通过 translate py 运行它 它是否会先验地受到
  • 如何向网页添加自定义右键菜单?

    我想向我的 Web 应用程序添加自定义右键菜单 可以在不使用任何预构建库的情况下完成此操作吗 如果是这样 如何显示一个不使用第 3 方 JavaScript 库的简单自定义右键菜单 我的目标是像 Google Docs 那样 它允许用户右键
  • 提示用户从 Dropbox 下载时保存

    我想要一个从 Dropbox 下载文件的链接 该链接会提示用户而不是在浏览器中显示该文件 这可能需要将内容处置标头设置为 附件 我目前正在使用 Dropbox 媒体 URL 如下所述 https www dropbox com develo
  • C2039:类不是命名空间的成员

    法师 接口 Context h pragma once include
  • onResume 手机屏幕锁定时被反复呼叫

    看来 如果手机屏幕锁定时某个 Activity 位于前台 广播事件和 或唤醒锁将导致该 Activity 的 onResume 被调用 无论它们是否适用于您的应用程序 即使您不以任何方式与手机交互 也会发生这种情况 不解锁它 不触摸它 不做
  • Android 上的 SQLite 数据库有大小限制吗? [复制]

    这个问题在这里已经有答案了 我想将 db 文件内部存储在设备 SD 卡中 并希望从中访问数据 有人可以告诉我们在我们的 Android 应用程序中可以检索的 db 文件的最大大小吗 没有任何内存异常 SQLite 的最大大小为 10MB 到
  • 类型类与代数数据类型?

    我经常开始考虑要定义的类型类方面的问题 并意识到当我开始编码时我不需要类型类 并且可以使用代数数据类型来解决我的问题 这看起来更简单 因此 我想知道什么时候需要类型类 据我了解 类型类是表示某些类型存在某些函数的一种方式 例如 当类型 My
  • 迭代 openpyxl 中的只读工作簿中的列

    我有一个有点大的 xlsx 文件 19 列 5185 行 我想打开文件 读取一列中的所有值 对这些值执行一些操作 然后在同一工作簿中创建一个新列并写出修改后的值 因此 我需要能够在同一个文件中读取和写入 我原来的代码是这样做的 def re