后台:来自亚马逊S3的流媒体日志文件。从压缩文件开始,经过几个步骤后,我得到了一个类似文件的对象。对于gzip压缩文件,我解压缩流中的一个块,这是一个字符串,然后使用str.splitlines()
来获取行列表。
csv.reader
接受任何带有迭代器协议的东西,比如文件和列表。但是,对于文件,我需要在完成所有操作后file.close()
。然后,当解压缩和解压缩时,我拥有的文件将成为csv和tsv文件。逗号或制表符分隔。
delims = [',','\t']
对于zipfile,由于中间步骤是使ZipExtFile没有seek()
函数,我不能使用csv.Sniffer
。对于gzip文件,它们被流式传输并成为行列表。
如何在调用csv.reader
时动态找出要使用的分隔符?我目前正在使用下面的代码(based off this)。理想情况下,我向此发送teststr
,然后致电csv.reader(csvfile, delimiter = k)
。
但是,如何获取要测试的文件/列表的样本,然后返回到文件的开头,因为这两种类型的输入都没有seek()
函数?
teststr = 'how,-do,-you,-dynamically,-identify,-unknown,-delimiters,-in,-a,-data'
def find_delimiter(teststr):
# how-do-you-dynamically-identify-unknown-delimiters-in-a-data-file
possible = [',','\t','-']
count = {}
for c in teststr:
if c in possible: count[c] = count.get(c,0) + 1
delim = [key for key,val in count.iteritems() if val == max(count.values())]
if len(delim) == 1:
delim = delim[0]
else:
print delim
delim = None
return delim
k = find_delimiter(teststr)
print k
答案 0 :(得分:0)
个人解决方案摘要。
决定小方法有效,所以我改变了我的方法:打开或流式传输文件,暂时忽略csv.reader()
(并希望大多数数据在换行行为中表现良好,它 应该使用.readline()
字符串方法来获取几行。
然后将其发送到上面的find_delimiter
方法,然后通过csv.reader()
运行行和返回的分隔符。