【问题标题】:numpy genfromtxt issues with .txt input.txt 输入的 numpy genfromtxt 问题
【发布时间】:2015-12-01 14:40:26
【问题描述】:

我正在尝试使用 numpy.genfromtxt 函数导入包含字符串和数字列的 txt。本质上我需要一个字符串数组。这是一个给我带来麻烦的示例txt:

    H2S 1.4
    C1  3.6

txt 被编码为 un​​icode。这是我正在使用的代码:

import numpy as np          
decodf= lambda x: x.decode('utf-16')
sample = np.genfromtxt(('ztest.txt'), dtype=str,
                        converters = {0:decodf, 1:decodf},
                                     delimiter='\t',
                                     usecols=0)
print(sample)

这是输出:

['H2S' 'None']

我尝试了多种方法来解决此问题。通过设置 dtype=None 并消除转换器,我得到:

[b'\xff\xfeH\x002\x00S' b'\x00g\x00\xe8\x00n']

我还尝试消除转换器并将 dtype=str 并得到:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)

我知道这是一个麻烦的功能。我看到了不同的选择 (例如:here)但无法让任何人工作。

我做错了什么?与此同时,我正在研究熊猫... 提前致谢

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您的文件被编码为 UTF-16,前两个字符是 BOM

    试试这个(使用 python 2.7):

    import io
    import numpy as np
    
    with io.open('ztest.txt', 'r', encoding='UTF-16') as f:
        data = np.genfromtxt(f, delimiter='\t', dtype=None, usecols=[0])  # or dtype=str
    

    genfromtxt 在带有 Unicode 文件的 python 3 中运行时会出现一些问题。作为一种解决方法,您可以在将它们传递给genfromtxt 之前简单地对这些行进行编码。例如,以下代码将每一行编码为 latin-1,然后将这些行传递给genfromtxt

    import io
    import numpy as np
    
    with io.open('ztest.txt', 'r', encoding='UTF-16') as f:
        lines = [line.encode('latin-1') for line in f]
        data = np.genfromtxt(lines, delimiter='\t', dtype=None, usecols=[0])
    

    【讨论】:

    • 您好,感谢您的回答。您的代码产生TypeError: Can't convert 'bytes' object to str implicitly
    • 啊,对。我使用的是 python 2.7。使用 python 3.4 时出现同样的错误。
    猜你喜欢
    • 2023-04-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2021-03-26
    • 1970-01-01
    • 2014-01-27
    • 2012-05-10
    相关资源
    最近更新 更多