背景:来自亚马逊S3的流日志文件。从压缩的文件,经过几步,我得到一个类似文件的对象。对于压缩的文件,我在流中解压缩一个块,这是一个字符串,然后使用str.splitlines()获取一个行列表。
csv.reader接受任何带有迭代器协议的内容,比如文件和列表。但是,对于文件,在完成所有操作之后,我将需要file.close()。我所拥有的文件,当解压缩和解压缩时,变成csv和tsv文件。逗号或制表符分隔。
delims = [',','\t']对于can文件,由于中间一步是生成一个没有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发布于 2014-08-28 19:08:50
个人溶胶概述。
决定了这个小方法是有效的,所以我改变了我的方法:打开或流文件,暂时忽略csv.reader() (并希望大多数数据在换行符行为中表现良好,应该是这样),使用字符串的.readline()方法获取几行。
然后将其发送到上面的find_delimiter方法,然后通过csv.reader()运行行和返回的分隔符。
https://stackoverflow.com/questions/25537543
复制相似问题