我熟悉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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。