Python从大型文本文件中读取完整行的块(列值拆分为多行)

2024-02-12

我想分块读取一个大的 .txt 文件(c.2.5GB),然后在加载到数据库之前执行一些操作。

该文件只有 2 列(列分隔符为¬)并且有资格double quotes。第二列中的值可以跨越多行(下面的示例)。我想用这个answer https://stackoverflow.com/questions/519633/lazy-method-for-reading-big-file-in-python/519653#519653但问题是它可能会处理不完整的行,因为它取决于预设chunk size。有人可以帮忙吗?我在下面提供了示例数据和代码。

示例数据(Sample_load_file.txt)

"LINE_ID"¬"LINE_TEXT"
"C1111-G00-BC222"¬"this line is
split into
multiple lines
% All needs to be read into 1 line
% Currently that's not happening
"
"C22-f0-333"¬"2nd row. This line is
split into
multiple lines
% All needs to be read into 1 line
% Currently that's not happening
  *******************************************************************
  This line also includes the column delimiter within text qualifier
  *******************************************************************
  # !¬!¬!¬|
"

Code

import pandas as pd
import os
from dbconnection import DBConnection

path = r'C:\Sample_load_file.txt'
db = DBConnection(server ='XXXX', database='XXXX')

def read_in_chunks(file_object, chunk_size=1024):
    #Lazy load to read a file piece by piece (avoiding moemory issues)
    #Default chunk size: 1k.
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data
        
def process_chunk(data=piece):
    #Build a list of lines based on ' "\n" ' as custom separator
    data = data.split('"\n"')
    
    #Split each line based on ' "¬" ' as custom separator
    data = [line.split('"¬"') for line in data]
    
    #Cleanup remaining double quotes
    data = [[e.replace('"', '') for e in line] for line in data]
    
    #Check the number of columns
    number_of_cols = len(str(data[0]).split('¬'))
    number_of_cols
    
    #Load data into a dataframe
    df = pd.DataFrame(data)
    
    #Reformat dataframe
    df.columns = df.iloc[0] # Set first row as column index
    df = df.iloc[1:].reset_index(drop=True) # Drop first line and reset index
    
    #Split the first column into two
    try:
        df[['LINE_ID', 'LINE_TEXT']] = df['LINE_ID¬LINE_TEXT'].str.split('¬',expand=True)
    except:
        print('Error')
    del df['LINE_ID¬LINE_TEXT']
    
    #Add metadata
    df['loaded_by'] = 'XXXX'
    df['file_line_number'] = range(2,len(df)+2)
    df['load_date'] = pd.datetime.now()
    df['source_file'] = path
    df['loading_script'] = r'Load_Extracts.ipynb'    
    
    #Load in SQL db
    df.to_sql('SQL_table_name', db.engine, schema='dbo', index=False, if_exists='append')
    
#Load text file
with open(path) as f:
    for piece in read_in_chunks(f):
        process_data(piece)

If LINE_ID适合一行,您可以尝试使用一个生成器,该生成器利用多行记录的第一行包含"¬":

def make_records(file):
    current = []
    for line in file:
        line = line.rstrip()
        if '"¬"' in line:
            if current:
                yield " ".join(current)
            current = [line]
        else:
            current.append(line)
    yield " ".join(current)

使用示例输入:

>>> import io
>>> 
>>> s = '''"LINE_ID"¬"LINE_TEXT"
... "C1111-G00-BC222"¬"this line is
... split into
... multiple lines
... % All needs to be read into 1 line
... % Currently that's not happening
... "
... "C22-f0-333"¬"2nd row. This line is
... split into
... multiple lines
... % All needs to be read into 1 line
... % Currently that's not happening
...   *******************************************************************
...   This line also includes the column delimiter within text qualifier
...   *******************************************************************
...   # !¬!¬!¬|
... "'''
>>> f = io.StringIO(s)
>>> for record in make_records(f):
...    print(record)
... 
"LINE_ID"¬"LINE_TEXT"
"C1111-G00-BC222"¬"this line is split into multiple lines % All needs to be read into 1 line % Currently that's not happening "
"C22-f0-333"¬"2nd row. This line is split into multiple lines % All needs to be read into 1 line % Currently that's not happening   *******************************************************************   This line also includes the column delimiter within text qualifier   *******************************************************************   # !¬!¬!¬| "

注意:您可能想要更改生成器的内容yields,例如,list or tuple代替str,根据您的需要删除双引号,跳过第一行。我用了io.StringIO仅出于说明目的,您将从“正常”文件中读取。

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

Python从大型文本文件中读取完整行的块(列值拆分为多行) 的相关文章

随机推荐

  • vim:打开水平和垂直分割的4个文件

    在命令行上 vim可以打开4个水平分割的文件 vim o file1 file2 file3 file4 或 4 个文件垂直分割 vim O file1 file2 file3 file4 如何打开 4 个文件 使其水平和垂直分割 如下所示
  • 从数据库填充下拉列表

    我的实体框架中有一个 mvc 3 应用程序 其中有 2 个表 我有另一个名为 Product 的表 其中包含 ProductID 和 ProductName 创建新视图以插入新购买 如何将视图中的 ProductID 文本框更改为由 Pro
  • 导入库仅用于调试

    我在用stetho用于调试我的应用程序的lib Gradle debugCompile com facebook stetho stetho 1 4 1 debugCompile com uphyca stetho realm 2 0 0
  • 添加Java系统模块在Eclipse中编译

    我有一些遗留的 Java 代码 即 package org alo test j9 import javax activation DataHandler in java activation module import javax ann
  • SetWindowSubclass 内的 msftedit.dll RichEdit 控件出现“访问冲突读取位置 0x00000008”错误

    我在单独的子类文件中有编辑控件 在开始工作 SetWindowSubclass 函数后 我是 C 新手 之前我使用 SetWindowLongPtr 进行子类化 它工作得很好 但有人建议我开始使用 SetWindowSubclass 我遇到
  • Grails 渲染插件在部署时不会渲染图像

    我正在使用 grails 渲染插件生成 pdf 在开发过程中 我使用带 src 的标签将图像包含到服务器上的图像中 它工作正常 但部署应用程序后就不再工作了 图像就消失了 我正在通过模板进行渲染 因此当我在 gsp 中调用此模板时 这是可以
  • IQueryable 复杂顺序 $sort 中仅允许使用字段

    我想对列表进行排序 当它是IEnumerable时它工作正常 但是我将其更改为IQueryable来查询MongoDB时 它不起作用 给我这个错误 System NotSupportedException sort 中仅允许使用字段 Que
  • python3 super 不适用于 PyQt 类

    python3中有一个简单的程序 from PyQt4 import QtCore import PyQt4 class Bar object def init self print Bar start super Bar self ini
  • 如何从来宾操作系统获取 Citrix XenServer VM 的唯一 ID?

    假设我有多个同名的 Citrix XenServer VM 或者 这些名字都是垃圾 没关系 从其中一台虚拟机上的来宾操作系统中 我如何以编程方式确定虚拟机的 ID 我希望虚拟机的 UUID 应该作为来宾操作系统的 BIOS 序列号 但事实并
  • Typo3 流体图像裁剪,高度失败

    使用此代码
  • TouchJSON 返回可变对象吗?

    我从网络服务接收一些 json 我使用 TouchJSON 库解析它 我保留数据供用户更改某些值 然后我想将其返回到网络服务 我得到的 JSON 对象在对象中包含 NSDictionary 对象 如下所示 id null created a
  • 开源、多平台、基于浏览器的屏幕捕获扩展? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑一个项目 该项目涉及浏览器用户能够屏幕捕获任何网页的内容 最好是整个页面 而不仅仅是可见部分
  • 为什么 cqlsh 右对齐字符串?

    我发现使用 cqlsh 显示的字符串值是右对齐的 是否有一个原因 有没有办法左对齐字符串 cqlsh test gt create table test id int a ascii t text primary key id cqlsh
  • 当其中一个容器失败时,SSIS 包是否失败

    我有一个包含 1 个容器的包 如果该容器失败 ssis 包是否会失败 该物业 失败时失败包 对于容器来说是 false 这是否意味着只有当该属性设置为 TRUE 时包才会失败 否则只有容器状态失败 而包状态不是 是的 如果序列容器失败 则整
  • 获取webclient中通过AJAX生成的html

    我经常去某个网站查找资料 我心想 等等 我可以编程 当我可以编写一个为我做这件事的软件时 为什么我要手动访问这个网站呢 于是我开始了 我使用的是 C 所以我找到了 WebClient 和 Uri 我已经设法获取该网站的源代码 但出现的问题是
  • “弱参考”:需要脚踏实地的解释

    有人可以解释一下吗弱引用在德尔福 我注意到这个概念经常在我仔细检查的一些库 框架源代码中提到 我陷入了困境 想要对其有一个清晰的了解 通过接口引用相互引用的实例在基于引用计数的接口实现中使彼此保持活动状态 弱引用用于打破 让彼此活着 的熊抱
  • 无法实例化 DatePipe

    我正在尝试实例化一个DatePipe我的 Angular2 应用程序中要使用的对象transform 我正在开发的组件中的功能 import DatePipe from angular common Component export cla
  • Android SecurityException:uid xxxxx 无法显式添加帐户

    我收到错误消息 java lang SecurityException uid 10178 cannot explicitly add accounts of type net roughdesign swms 即使是我可以创建的最基本的示
  • 带有 RuntimeWarning 的 numpy 除法:double_scalars 中遇到无效值

    我写了以下脚本 import numpy d numpy array 1089 1093 e numpy array 1000 4443 answer numpy exp 3 d answer1 numpy exp 3 e res answ
  • Python从大型文本文件中读取完整行的块(列值拆分为多行)

    我想分块读取一个大的 txt 文件 c 2 5GB 然后在加载到数据库之前执行一些操作 该文件只有 2 列 列分隔符为 并且有资格double quotes 第二列中的值可以跨越多行 下面的示例 我想用这个answer https stac