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

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...