首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串或文件的分隔符:使用csv.reader()而不是csv.Sniffer()

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

Stack Overflow用户
提问于 2014-08-27 21:50:58
回答 1查看 557关注 0票数 0

背景:来自亚马逊S3的流日志文件。从压缩的文件,经过几步,我得到一个类似文件的对象。对于压缩的文件,我在流中解压缩一个块,这是一个字符串,然后使用str.splitlines()获取一个行列表。

csv.reader接受任何带有迭代器协议的内容,比如文件和列表。但是,对于文件,在完成所有操作之后,我将需要file.close()。我所拥有的文件,当解压缩和解压缩时,变成csv和tsv文件。逗号或制表符分隔。

代码语言:javascript
复制
delims = [',','\t']

对于can文件,由于中间一步是生成一个没有ZipExtFile函数的seek(),所以我不能使用csv.Sniffer。对于gzip文件,它们是流的,并成为一个行列表。

如何动态地确定在调用csv.reader时使用哪个分隔符?我目前正在使用下面的代码(based off this)。理想情况下,我向它发送一个teststr,然后调用csv.reader(csvfile, delimiter = k)

但是,如何测试文件/列表的示例,然后返回到文件的开头,因为两种类型的输入都没有seek()函数。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-28 19:08:50

个人溶胶概述。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25537543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档