字符串或文件的分隔符:使用csv.reader()而不是csv.Sniffer()

时间:2014-08-27 21:50:59

标签: python csv file-io delimiter

后台:来自亚马逊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

1 个答案:

答案 0 :(得分:0)

个人解决方案摘要。

决定小方法有效,所以我改变了我的方法:打开或流式传输文件,暂时忽略csv.reader()(并希望大多数数据在换行行为中表现良好,它 应该使用.readline()字符串方法来获取几行。

然后将其发送到上面的find_delimiter方法,然后通过csv.reader()运行行和返回的分隔符。