将文本数据库分成 N 个相等的块并保留标题

2023-12-01

我有几个大型(30+ 百万行)文本数据库,我正在使用以下代码清理它们,我需要将文件拆分为 100 万行或更少,并保留标题行。我查看了 chunk 和 itertools 但无法得到明确的解决方案。它用于 arcgis 模型。

== 根据 icyrock.com 的响应更新了代码

import arcpy, os
#fc = arcpy.GetParameter(0)
#chunk_size = arcpy.GetParameter(1) # number of records in each dataset

fc='input.txt'
Name = fc[:fc.rfind('.')]
fl = Name+'_db.txt'

with open(fc) as f:
  lines = f.readlines()
lines[:] = lines[3:]
lines[0] = lines[0].replace('Rx(db)', 'Rx_'+Name)
lines[0] = lines[0].replace('Best Unit', 'Best_Unit')
records = len(lines)
with open(fl, 'w') as f: #where N is the chunk number
  f.write('\n'.join(lines))

with open(fl) as file:
  lines = file.readlines()

headers = lines[0:1]
rest = lines[1:]
chunk_size = 1000000

def chunks(lst, chunk_size):
  for i in xrange(0, len(lst), chunk_size):
    yield lst[i:i + chunk_size]

def write_rows(rows, file):
  for row in rows:
    file.write('%s' % row)

part = 1
for chunk in chunks(rest, chunk_size):
  with open(Name+'_%d' % part+'.txt', 'w') as file:
    write_rows(headers, file)
    write_rows(chunk, file)
  part += 1

See 从 python 中的大型文本文件中删除特定行 and 将大型文本 (xyz) 数据库拆分为 x 个相等的部分为背景。我不再需要基于 cygwin 的解决方案,因为它使模型过于复杂。我需要一种Pythonic方式。我们可以使用“记录”来迭代,但不清楚的是如何指定 db #1 中的第 1:999,999 行,db#2 中的第 1,000,0000 到 1,999,999 行等。如果最后一个数据集小于 1m 就可以了记录。

500mb 文件出错(我有 16GB RAM)。

回溯(最近一次调用最后一次):文件 “P:\ 2012 \ Job_044_DM_Radio_Propogation \工作\测试\ clean_file.py”, 第 10 行,在 行 = f.readlines() MemoryError

记录 2249878

上面的记录量不是总记录数,它只是内存不足的地方(我认为)。

=== 使用 Icyrock 的新代码。

该块似乎工作正常,但在 Arcgis 中使用时出现错误。

开始时间:2012 年 3 月 9 日星期五 17:20:04 警告 000594:输入功能 1945882430:落在输出几何域之外。警告 000595: d:\Temp\cb_vhn007_1.txt_Features1.fid 包含完整列表 无法复制的功能。

我知道这是分块的问题,因为“创建事件层”过程可以很好地处理完整的预分块数据集。

有任何想法吗?


你可以这样做:

with open('file') as file:
  lines = file.readlines()

headers = lines[0:1]
rest = lines[1:]
chunk_size = 4

def chunks(lst, chunk_size):
  for i in xrange(0, len(lst), chunk_size):
    yield lst[i:i + chunk_size]

def write_rows(rows, file):
  for row in rows:
    file.write('%s' % row)

part = 1
for chunk in chunks(rest, chunk_size):
  with open('part%d' % part, 'w') as file:
    write_rows(headers, file)
    write_rows(chunk, file)
  part += 1

这是一个测试运行:

$ cat file && python mkt.py && for p in part*; do echo ---- $p; cat $p; done
header
1
2
3
4
5
6
7
8
9
10
11
12
13
14
---- part1
header
1
2
3
4
---- part2
header
5
6
7
8
---- part3
header
9
10
11
12
---- part4
header
13
14

显然,改变chunk_size以及你如何获取headers取决于他们的计数。

Credits:

  • https://stackoverflow.com/a/312464/438544

编辑 - 要逐行执行此操作以避免内存问题,您可以执行以下操作:

from itertools import islice

headers_count = 5
chunk_size = 250000

with open('file') as fin:
  headers = list(islice(fin, headers_count))

  part = 1
  while True:
    line_iter = islice(fin, chunk_size)
    try:
      first_line = line_iter.next()
    except StopIteration:
      break
    with open('part%d' % part, 'w') as fout:
      for line in headers:
        fout.write(line)
      fout.write(first_line)
      for line in line_iter:
        fout.write(line)
    part += 1

Credits:

  • Python如何一次读取N行

测试用例(将以上内容放入名为mkt2.py):

创建一个包含 5 行标题和 1234567 行的文件:

with open('file', 'w') as fout:
  for i in range(5):
    fout.write(10 * ('header %d ' % i) + '\n')
  for i in range(1234567):
    fout.write(10 * ('line %d ' % i) + '\n')

要测试的 Shell 脚本(放入名为rt.sh):

rm part*
echo ---- file
head -n7 file
tail -n2 file

python mkt2.py

for i in part*; do
  echo ---- $i
  head -n7 $i
  tail -n2 $i
done

示例输出:

$ sh rt.sh 
---- file
header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 
header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 
header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 
header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 
header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 
line 0 line 0 line 0 line 0 line 0 line 0 line 0 line 0 line 0 line 0 
line 1 line 1 line 1 line 1 line 1 line 1 line 1 line 1 line 1 line 1 
line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 
line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 
---- part1
header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 
header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 
header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 
header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 
header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 
line 0 line 0 line 0 line 0 line 0 line 0 line 0 line 0 line 0 line 0 
line 1 line 1 line 1 line 1 line 1 line 1 line 1 line 1 line 1 line 1 
line 249998 line 249998 line 249998 line 249998 line 249998 line 249998 line 249998 line 249998 line 249998 line 249998 
line 249999 line 249999 line 249999 line 249999 line 249999 line 249999 line 249999 line 249999 line 249999 line 249999 
---- part2
header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 
header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 
header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 
header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 
header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 
line 250000 line 250000 line 250000 line 250000 line 250000 line 250000 line 250000 line 250000 line 250000 line 250000 
line 250001 line 250001 line 250001 line 250001 line 250001 line 250001 line 250001 line 250001 line 250001 line 250001 
line 499998 line 499998 line 499998 line 499998 line 499998 line 499998 line 499998 line 499998 line 499998 line 499998 
line 499999 line 499999 line 499999 line 499999 line 499999 line 499999 line 499999 line 499999 line 499999 line 499999 
---- part3
header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 
header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 
header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 
header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 
header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 
line 500000 line 500000 line 500000 line 500000 line 500000 line 500000 line 500000 line 500000 line 500000 line 500000 
line 500001 line 500001 line 500001 line 500001 line 500001 line 500001 line 500001 line 500001 line 500001 line 500001 
line 749998 line 749998 line 749998 line 749998 line 749998 line 749998 line 749998 line 749998 line 749998 line 749998 
line 749999 line 749999 line 749999 line 749999 line 749999 line 749999 line 749999 line 749999 line 749999 line 749999 
---- part4
header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 
header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 
header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 
header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 
header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 
line 750000 line 750000 line 750000 line 750000 line 750000 line 750000 line 750000 line 750000 line 750000 line 750000 
line 750001 line 750001 line 750001 line 750001 line 750001 line 750001 line 750001 line 750001 line 750001 line 750001 
line 999998 line 999998 line 999998 line 999998 line 999998 line 999998 line 999998 line 999998 line 999998 line 999998 
line 999999 line 999999 line 999999 line 999999 line 999999 line 999999 line 999999 line 999999 line 999999 line 999999 
---- part5
header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 header 0 
header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 header 1 
header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 header 2 
header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 header 3 
header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 header 4 
line 1000000 line 1000000 line 1000000 line 1000000 line 1000000 line 1000000 line 1000000 line 1000000 line 1000000 line 1000000 
line 1000001 line 1000001 line 1000001 line 1000001 line 1000001 line 1000001 line 1000001 line 1000001 line 1000001 line 1000001 
line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 line 1234565 
line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 line 1234566 

上述时间安排:

real    0m0.935s
user    0m0.708s
sys     0m0.200s

希望这可以帮助。

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

将文本数据库分成 N 个相等的块并保留标题 的相关文章

  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • Django dumpdata 和 loaddata 不适用于多对多中介模型

    我在以下模型上将 dumpdata 与 Django 1 2 3 一起使用 class Bar models Model class Foo models Model bars models ManyToManyField Bar thro
  • Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

    我正在尝试在 MQL5 中设置一个 PUB 套接字 并在 Python 中设置一个 SUB 套接字来接收消息 我在 MQL5 中有这个 include
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 使用字典映射数据帧索引

    为什么不df index map dict 工作就像df column name map dict 这是尝试使用index map的一个小例子 import pandas as pd df pd DataFrame one A 10 B 2
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • import matplotlib.pyplot 给出 AttributeError: 'NoneType' 对象没有属性 'is_interactive'

    我尝试在 Pycharm 控制台中导入 matplotlib pyplt import matplotlib pyplot as plt 然后作为回报我得到 Traceback most recent call last File D Pr
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • Python ImportError:无法导入名称 __init__.py

    我收到此错误 ImportError cannot import name life table from cdc life tables C Users tony OneDrive Documents Retirement retirem
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是

随机推荐

  • 购物车的“查看购物车商品”页面未正确分页

    我有一个 PHP 页面 用于检索我的数组中的数组 SESSION products 会议 该会话中的每个数组都是用户通过以下方式添加到其 购物车 中的产品 catalogue php页 目前我的会话有 11 个阵列 这意味着我已将 11 个
  • Blade 中的 Vue 组件

    我正在尝试使用this在我的刀片视图中 我有 vue文件和JS中的以下代码 import Multiselect from vue multiselect export default components Multiselect data
  • 将结果从 ReportMemoryLeaksOnShutdown 重定向到日志文件

    我想将内存泄漏检测添加到我们的自动化单元测试中 ReportMemoryLeaksOnShutdown 将检测任何内存泄漏 最大的问题是它将结果打印到模式对话框中 该对话框必须由用户手动关闭 这在构建服务器上运行的自动化单元测试中不起作用
  • 12:xx 在 SimpleDateFormat.format("hh:mm:ss") 中显示为 00:xx

    在以下代码中使用 SimpleDateFormatter format 时 12 00 到 12 59 之间的时间在 startDateText TextView 中显示为 00 00 到 00 59 而从 13 00 开始 它们正确显示为
  • 在clearcase中如何将不可修改的基线转换为可修改的?

    创建了一个新的 UCM 项目 并配置了多个基线 当我尝试从特定组件签出文件时 我不被允许签出 并且它说流可能是只读的 我可以查看流中的其他组件文件 所以我尝试运行以下命令 cleartool lsstream view MyBuildVie
  • 如何使用 python-docx 以编程方式在 MS Word 中的页面布局中实现列

    我需要实现word文档的设计 我必须使用 python docx 库以编程方式将该文档的页面布局设置为 2 列布局 请帮忙 我用谷歌搜索这个问题并关注你在 stackoverflow 和谷歌论坛上的评论 我解决了这个问题 下面的代码帮助了我
  • 如何在管理表单的日期字段中接受本地化日期格式(例如 dd/mm/yy)?

    是否可以自定义 django 应用程序以在管理表单的 DateField 中接受本地化日期格式 例如 dd mm yy 我有一个模型类 class MyModel models Model date models DateField Dat
  • 将日期转换为正确的格式

    我有一个网络服务 它通过以下方式返回我的日期 Wed Oct 31 11 59 44 0000 2012 但我希望它以这种方式还给我 31 10 2012 11 59 我知道应该使用 NSDateFormatter 来完成 但我现在不知道如
  • 在 PHP 中使用具有抽象类型的 WSDL

    我正在研究我们的 Web 应用程序和 Microsoft Exchange 2007 之间的集成 我正在使用 Exchange Web 服务 EWS 与 Exchange Server 进行通信 但是 我在使用 WSDL 时遇到了一些问题
  • 从 BroadcastReceiver 更新 Activity

    这个问题提出了一个有趣的问题 OP 有一个显示地图的应用程序 该地图需要使用通过 SMS 消息接收的位置标记进行更新 各个步骤相当简单 SMS 消息可以由BroadcastReceiver 标记可以通过ItemizedOverlay在一个上
  • 将 JTextArea 或 JTextPane 中的文本居中 - 水平文本对齐

    有没有办法像 JTextField 一样为 JTextArea 创建水平居中的文本 setHorizontalAlignment JTextField CENTER 有没有办法可以使用多行文本区域完成同样的事情 我找不到 JTextArea
  • Firebase 存储和访问控制允许来源

    我正在尝试通过 XMLHttpRequest 从 Firebase Storage 下载文件 但资源上未设置 Access Control Allow Origin 因此这是不可能的 有没有办法在存储服务器上设置这个标头 let xhr j
  • PHP/Mysqli:为什么此代码会使插入行加倍?

    我的代码需要帮助 不知何故 我的代码创建了两个房间 它一次将两行插入表中 我不知道为什么 我需要每个插入都需要一个 id 才能知道我们在哪个房子中创建一个新房间 我的数据库包含表 house 和表 room 表 room 有一个字段 hou
  • python用多个键填充搁置对象/字典

    我有一个 4 gram 列表 我想用它来填充字典对象 shevle 对象 I go to work I go there often it is nice being I live in NY I go to work 这样我们就有了类似的
  • Python 中递归调用的 return 语句如何保存中间值?

    正在查看一些与递归调用相关的 python 代码 并注意到 return 语句看起来很有趣 当下一次递归调用的返回语句中没有变量赋值时 递归如何工作 当进行递归调用时 中间求和值没有存储在明显的位置 调试器似乎显示列表每次调用都会减少一 但
  • NLog 内部记录器的编程配置

    任何人都可以帮助 NLog 内部记录器的编程配置吗 我有各种目标 电子邮件目标不发送任何电子邮件 尽管它确实有日志记录规则 所以我希望通过启用内部日志来获得更多见解 但是 我进行了编程配置 但没有找到任何在代码中设置内部记录器的资源 索姆斯
  • 定义一个特定表格单元格的高度

    我有一个带有两个自定义单元格的 tableView 我需要定义一个单元格的高度 但不理会另一个单元格的高度 我正在尝试学习 Objective C 所以任何帮助将不胜感激 在 UITableView 委托中 实现例程 tableView h
  • 如何比较两个数组列表中至少有一个属性不同的相似对象?

    我有两个数组列表 每个都有用户类型的对象列表 User 类如下所示 public class User private long id private String empCode private String firstname priv
  • 将字节数组转换为字符串 (Java)

    我正在 Google app Engine 中编写一个网络应用程序 它允许人们基本上编辑 html 代码 并将其存储为 htmlblobstore 中的文件 我正在使用 fetchData 返回一个byte 文件中的所有字符 我正在尝试打印
  • 将文本数据库分成 N 个相等的块并保留标题

    我有几个大型 30 百万行 文本数据库 我正在使用以下代码清理它们 我需要将文件拆分为 100 万行或更少 并保留标题行 我查看了 chunk 和 itertools 但无法得到明确的解决方案 它用于 arcgis 模型 根据 icyroc