加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 获取类似csv的解析和行长字节数?

发布时间:2020-12-20 11:54:02 所属栏目:Python 来源:网络整理
导读:我熟悉csv Python模块,并且相信在我的情况下它是必要的,因为我有一些字段包含引号内的分隔符(而不是,但这是不相关的). 但是,在分割成列之前,我还在寻找每个原始行的字节数长度.我不能指望数据总是引用一个列,我不知道是否/当csv将剥离外部引号,所以我不认为(
我熟悉csv Python模块,并且相信在我的情况下它是必要的,因为我有一些字段包含引号内的分隔符(而不是,但这是不相关的).

但是,在分割成列之前,我还在寻找每个原始行的字节数长度.我不能指望数据总是引用一个列,我不知道是否/当csv将剥离外部引号,所以我不认为(但可能是错误的)只是加入我的分隔符将重现原始行字符串(少CRLF字符).意思是,我不肯定以下作品:

with open(fname) as fh:
    reader = csv.reader(fh,delimiter="|")
    for row in reader:
        original = "|".join(row) ## maybe?

我已经尝试过查看csv以查看是否有任何东西我可以使用/ monkey-patch用于此目的,但由于_csv.reader是一个.so,我不知道如何搞乱它.

如果我正在处理XY问题,我的最终目标是通读CSV文件,提取某些字段及其整体文件偏移量,以创建一种查找索引.这样,稍后,当我有一个候选值列表时,我可以检查每个文件的偏移量和seek(),而不是再次查看整个文件.作为一个规模的想法,我可能有100k值来查找10GB文件,所以重新读取文件100k倍对我来说效率不高.我对除CSV模块之外的其他建议持开放态度,但仍需要类似csv的智能解析行为.

编辑:不知道如何使标题和正文已经解释清楚 – 只是寻找() – 文件句柄是不够的,因为我还需要将行解析为csv,以便提取其他信息.

解决方法

您不能将_csv.reader子类化,但csv.reader() constructor的csvfile参数只能是“类文件对象”.这意味着您可以提供自己的类的实例来执行一些预处理 – 例如记住最后一行读取的长度和文件偏移量.这是一个显示确切的实现.请注意,行长度不包括行尾字符.它还显示了在读取文件后如何存储和使用每行/行的偏移量.

import csv

class CSVInputFile(object):
    """ File-like object. """
    def __init__(self,file):
        self.file = file
        self.offset = None
        self.linelen = None
    def __iter__(self):
        return self
    def __next__(self):
        offset = self.file.tell()
        data = self.file.readline()
        if not data:
            raise StopIteration
        self.offset = offset
        self.linelen = len(data)
        return data
    next = __next__

offsets = []  # remember where each row starts
fname = 'unparsed.csv'
with open(fname) as fh:
    csvfile = CSVInputFile(fh)
    for row in csv.reader(csvfile,delimiter="|"):
        print('offset: {},linelen: {},row: {}'.format(
            csvfile.offset,csvfile.linelen,row))  # file offset and length of row
        offsets.append(csvfile.offset)  # remember where each row started

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读