我熟悉csv
Python模块,并且相信在我的情况下它是必要的,因为我有一些字段包含引号内的分隔符(|
而不是,
,但这是无关紧要的).
但是,在分割成列之前,我还在寻找每个原始行的字节数长度.我不能指望数据总是引用一个列,我不知道是否/何时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
以便提取其他信息.
你不能继承子类_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)
归档时间: |
|
查看次数: |
446 次 |
最近记录: |