如何在 Python 中将读取的大型 csv 文件分割成大小均匀的块?

2024-01-05

基本上我有下一个过程。

import csv
reader = csv.reader(open('huge_file.csv', 'rb'))

for line in reader:
    process_line(line)

看这个相关question https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python。我想每100行发送一次流程线,以实现批量分片。

实现相关答案的问题是 csv 对象是不可订阅的并且不能使用 len。

>>> import csv
>>> reader = csv.reader(open('dataimport/tests/financial_sample.csv', 'rb'))
>>> len(reader)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type '_csv.reader' has no len()
>>> reader[10:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '_csv.reader' object is unsubscriptable
>>> reader[10]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '_csv.reader' object is unsubscriptable

我该如何解决这个问题?


只需让你的reader通过将其包装成可下标list。显然,这会破坏非常大的文件(请参阅Updates below):

>>> reader = csv.reader(open('big.csv', 'rb'))
>>> lines = list(reader)
>>> print lines[:100]
...

进一步阅读:如何在 Python 中将列表分割成大小均匀的块? https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python


Update 1(列表版本):另一种可能的方法是在迭代行时处理每个卡盘:

#!/usr/bin/env python

import csv
reader = csv.reader(open('4956984.csv', 'rb'))

chunk, chunksize = [], 100

def process_chunk(chuck):
    print len(chuck)
    # do something useful ...

for i, line in enumerate(reader):
    if (i % chunksize == 0 and i > 0):
        process_chunk(chunk)
        del chunk[:]  # or: chunk = []
    chunk.append(line)

# process the remainder
process_chunk(chunk)

Update 2(生成器版本):我还没有对它进行基准测试,但也许你可以通过使用块来提高性能发电机:

#!/usr/bin/env python

import csv
reader = csv.reader(open('4956984.csv', 'rb'))

def gen_chunks(reader, chunksize=100):
    """ 
    Chunk generator. Take a CSV `reader` and yield
    `chunksize` sized slices. 
    """
    chunk = []
    for i, line in enumerate(reader):
        if (i % chunksize == 0 and i > 0):
            yield chunk
            del chunk[:]  # or: chunk = []
        chunk.append(line)
    yield chunk

for chunk in gen_chunks(reader):
    print chunk # process chunk

# test gen_chunk on some dummy sequence:
for chunk in gen_chunks(range(10), chunksize=3):
    print chunk # process chunk

# => yields
# [0, 1, 2]
# [3, 4, 5]
# [6, 7, 8]
# [9]

有一个小问题,如@totalhack https://stackoverflow.com/users/10682164/totalhack 指出 https://stackoverflow.com/questions/4956984/how-do-you-split-reading-a-large-csv-file-into-evenly-sized-chunks-in-python/4957046?noredirect=1#comment103177531_4957046:

请注意,这会一遍又一遍地产生具有不同内容的同一对象。如果您计划对每次迭代之间的块执行所需的所有操作,那么这种方法效果很好。

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

如何在 Python 中将读取的大型 csv 文件分割成大小均匀的块? 的相关文章

随机推荐

  • MATLAB 图形在插入 LaTeX 时不具有相同的大小(尽管使用相同的代码生成)

    我正在 MATLAB 中生成一些图形 并尝试将它们插入到 LaTeX 中 然而 当我这样做时 它们通常没有相同的大小 尽管我使用相同的设置来生成它们 例如 我当前使用的 MATLAB 代码是这个 lsize 16 Label fontsiz
  • 如何使用“kubectl patch --type='json'”更新秘密

    我创建了一个这样的秘密 kubectl create secret generic test from literal username testuser from literal password 12345 我想将用户名更新为testu
  • 如何为 msbuild.exe 指定其他包含目录

    我正在尝试安装 nodejs 模块 ibm db 我遇到的问题是 为了安装此模块 node gyp 需要使用 msbuild 构建它 但它不会检测我已安装的一些头文件 如何将附加头文件的目录添加到某个路径 以便 msbuild exe 在尝
  • 识别字符串中的特殊非字母数字字符

    我正在研究密码验证 该验证应该只允许 a z 0 9 和这些字符 lt gt 我尝试使用正则表达式 但我不太擅长使用它们 而且我不确定这是否可能 或者我是否没有转义正确的字符 var allowedCharacters A Za Z0 9
  • VTKCamera焦点和位置的差异

    我正在使用 vtkCamera 并尝试移动它并使其看起来在某个点 例如 如果我想把相机放在 x y z 并让它看看 0 0 0 例如 使用 openGL 中的 gluLookAt 我们会将眼睛坐标设置为 x y z 和中心坐标 0 0 0
  • Angular 6服务注入Interceptor后未定义

    我找不到任何方法来注入我的认证服务 inside 错误处理拦截器 它返回给我一个 不明确的 注入后的对象 否则会抛出错误 这是我的错误处理拦截器 import Injectable from angular core import Auth
  • 为列表列表中的每个列表创建单独的 Counter() 对象和 Pandas DataFrame

    我能找到的所有其他答案都专门提到了在列表列表中聚合所有嵌套列表 而我希望为每个列表单独聚合 我目前有一个列表列表 master list a a b b b c c c d d d a a a c c c c c c a a f f f 我
  • Netbeans 中的 Arduino(处理)库和控制

    我正在尝试控制 4 个 LED 并从 4 个触点获取模拟输入 该程序是用java编写的 因此要访问arduino的功能 例如AnalogRead 和将LED设置为高或低 导入处理库可以让程序使用这些功能吗 我还想知道 如果程序会自行传输到a
  • Durandal 登录页面重定向模式

    TL DR要求用户登录才能查看 Durandal 单页面应用程序 SPA 中的某些页面的好模式是什么 我需要一个系统 如果用户尝试导航到需要登录的 页面 他们会被重定向到登录页面 在此登录页面上成功进行身份验证后 我希望应用程序将它们重定向
  • XSLT 默认模板混淆

    我对 XSLT 处理器节点的方式感到困惑 假设我有一个像这样的 XML 文档
  • 将大数据写入套接字时最小化副本

    我正在编写一个处理图像 大数据 的应用程序服务器 在将图像数据发送回客户端时 我试图尽量减少副本 我需要发送给客户端的处理后的图像位于从 jemalloc 获得的缓冲区中 我想到的将数据发送回客户端的方式是 1 简单的写调用 Allocat
  • 由于表已存在而无法插入表中?

    我有一个用户表 我想将数据插入到我的用户表中 我有一个声明 SELECT columna columnb INTO my table FROM my other table WHERE conditions 我收到以下错误 SQL Serv
  • 在 Ruby 中,我可以在不使用正则表达式的情况下检查字符串是否包含字母吗?

    我正在使用 Rails 5 我想知道一个变量 您可以假设它是一个字符串 是否至少包含一个字母 大写或小写 但是 我不想使用正则表达式 我注意到如果编码不是 UTF 8 正则表达式往往会崩溃 所以我想知道如何检查字符串是否至少有一个字母 这不
  • 从 Eclipse 3.3 升级到 3.4(或未来版本)的最佳方法是什么

    过去 我在从 Eclipse 版本升级到另一个版本时遇到过问题 我想知道 StackOverflow 上的 Eclipse 用户如何处理 Eclipse 版本之间的升级 使用发行版是解决方案吗 停留在过去的释放点直到被迫前进 这是一个好主意
  • 捕获 OutOfMemoryException 使调试变得困难

    当我调试程序并尝试在立即窗口中执行某些操作时 有时会在立即窗口中显示一条错误消息 由于内存不足 函数评估被禁用 例外 它还显示 当通过将鼠标悬停在对象上来查看对象的属性时 在尝试找到问题的原因后 我将其范围缩小到这个小代码示例 using
  • 32 小时前 不包括周末 php

    所以我有一个脚本可以对 32 48 和 72 小时前进行多次检查 基本上我会检查数据库中至少 x 小时前的条目 现在效果很好 如下所示 date date Y m d H i s strtotime 32 hours q SELECT FR
  • 如何将MySQL表中的数据获取到Java JTable中?

    我正在开发 Java 项目 我需要将一组特定的数据加载到JTable 有人可以向我解释如何做到这一点吗 这些是我在名为 order processing 的数据库中的 mrnform 表中的字段 Date varchar 10 NOT NU
  • 如何设置 Windows 计划任务在后台运行? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有谁知道如何使用 Windows 任务计划程序设置计划任务在后台运行 似乎没有任何选择可以做到这一点 As noted https stackover
  • 尝试从安全站点生成 Web 服务客户端时出现奇怪的证书错误

    当尝试使用 AXIS1 4 Wsdl2Java 工具为安装在安全 IIS 站点上的 Web 服务生成客户端代码时 我收到一个奇怪的错误 当我运行该工具时 出现以下 SSL 异常 javax net ssl SSLHandshakeExcep
  • 如何在 Python 中将读取的大型 csv 文件分割成大小均匀的块?

    基本上我有下一个过程 import csv reader csv reader open huge file csv rb for line in reader process line line 看这个相关question https s