【问题标题】:Use np.loadtxt to split a column while reading阅读时使用 np.loadtxt 拆分列
【发布时间】:2014-12-13 13:22:46
【问题描述】:

有没有办法使用 np.loadtxt 和转换器参数将一列分成两列?

我的文本文件中的行如下所示:

1 2 A=3;B=4

我想把它读成:

[1,2,3,4]

文件很大,逐行读取会很慢。

我试过了:

parse_col = lambda x: [ float(x.split(';')[0].split('=')[1]), int(x.split(';')[1].split('=')[1]) ]

np.loadtxt('demo.txt',usecols=[0,1,2],comments='#',converters={2:parse_col},dtype=int)

谢谢!

【问题讨论】:

    标签: python file-io numpy text-files converters


    【解决方案1】:

    您可以创建一个调用解析器的生成器并将其传递给np.genfromtxt

    import re
    
    import numpy as np
    
    def parser(s):
        for i in re.findall('[a-zA-Z]+', s):
            s = s.replace(i, '')
        return s.replace('=', '').replace(';',' ')
    
    gen = (parser(line) for line in open('demo.txt'))
    np.genfromtxt(gen, comments='#', usecols=(0, 1, 2, 3))
    

    请注意,正如@PadraicCunningham 所指出的,我使用re.findall 来识别和替换更通用的模式。

    【讨论】:

    • 这仅适用于 A 和 B,这可能不是文件中的全部内容
    • @PadraicCunningham 你是对的......我已经使用re.findall() 更新了答案,并使用了更通用的模式
    • @SaulloCastro 谢谢!两个问题——我需要忽略列(我在解析器函数中这样做)并且“demo.txt”是一个压缩文件。这仍然有效吗?我在“解析器”中拆分 s 以选择列,我得到一个 indexerror
    • @Stefan 检查我刚刚在答案中所做的编辑...有一个参数usecols 应该使用它来忽略某些列...我认为这非常适合您的情况
    • @SaulloCastro 谢谢,我误解了生成器的工作原理——我认为 usecols 查看文件而不是生成器的输出。我的输入文件比这复杂一点,所以我只是替换了所有的 '=' 和 ';'用 '\t' 然后用 usecols 挑选出我感兴趣的。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2012-12-19
    • 2012-12-15
    • 2013-08-21
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多