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

dwa*_*son 3 python csv

我熟悉csvPython模块,并且相信在我的情况下它是必要的,因为我有一些字段包含引号内的分隔符(|而不是,,但这是无关紧要的).

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

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

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

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

编辑:不知道如何让它更清晰,而不是标题和正文已经解释过 - 简单地说 - seek()文件句柄是不够的,因为我需要将行解析为一个csv以便提取其他信息.

mar*_*eau 5

你不能继承子类_csv.reader,但构造函数csvfile参数只需要是一个"类文件对象".这意味着您可以提供自己的类的实例来执行一些预处理 - 例如记住最后一行读取的长度和文件偏移量.这是一个显示确切的实现.注意,线路长度也包括结束行的字符(多个).它还显示了在读取文件后如何存储和使用每行/行的偏移量.csv.reader()

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
Run Code Online (Sandbox Code Playgroud)

  • 这值得更多的赞成.我在一个自定义的Pytorch DataLoader类中使用它,有一些非常棘手的CSV文件,它就像一个梦想.我尝试了其他几种方法来解决CSV文件的索引问题,为随机访问做准备,这被证明是最可靠的. (2认同)