使用numpy loadtxt时添加'b'字符

时间:2015-11-11 16:54:07

标签: python numpy python-3.4

我尝试从文本文件创建一个数组。 我之前看到numpy有一个方法loadtxt,所以我尝试了,但它在每行之前添加了一些垃圾字符......

# my txt file

    .--``--.
.--`        `--.
|              |
|              |
`--.        .--`
    `--..--`

# my python v3.4 program

import numpy as np
f = open('tile', 'r')
a = np.loadtxt(f, dtype=str, delimiter='\n')
print(a)

# my print output

["b'    .--``--.    '"
 "b'.--`        `--.'"
 "b'|              |'"
 "b'|              |'"
 "b'`--.        .--`'"
 "b'    `--..--`    '"]

这些'b'和双引号是什么?它们来自哪里? 我尝试从互联网上挑选一些解决方案,比如用编解码器打开文件,用'S20','S11'改变dtype,以及许多其他不起作用的东西...... 我期望的是一个unicode字符串数组,如下所示:

[['    .--``--.    ']
 ['.--`        `--.']
 ['|              |']
 ['|              |']
 ['`--.        .--`']
 ['    `--..--`    ']]

的信息: 我正在使用debian稳定存储库中的python 3.4和numpy

5 个答案:

答案 0 :(得分:14)

np.loadtxtnp.genfromtxt以字节模式运行,这是Python 2中的默认字符串类型。但是Python 3使用unicode,并使用此b标记字节串。

我在python3 ipython会话中尝试了一些变体:

In [508]: np.loadtxt('stack33655641.txt',dtype=bytes,delimiter='\n')[0]
Out[508]: b'    .--``--.'
In [509]: np.loadtxt('stack33655641.txt',dtype=str,delimiter='\n')[0]
Out[509]: "b'    .--``--.'"
...
In [511]: np.genfromtxt('stack33655641.txt',dtype=str,delimiter='\n')[0]
Out[511]: '.--``--.'
In [512]: np.genfromtxt('stack33655641.txt',dtype=None,delimiter='\n')[0]
Out[512]: b'.--``--.'
In [513]: np.genfromtxt('stack33655641.txt',dtype=bytes,delimiter='\n')[0]
Out[513]: b'.--``--.'
带有genfromtxt

dtype=str提供最干净的显示 - 除了它剥离空白。我可能不得不使用转换器将其关闭。这些函数用于读取csv数据,其中(白色)空格是分隔符,而不是数据的一部分。

对于像这样的简单文字,

loadtxtgenfromtxt过度杀戮。普通文件读取很好:

In [527]: with open('stack33655641.txt') as f:a=f.read()
In [528]: print(a)
    .--``--.
.--`        `--.
|              |
|              |
`--.        .--`
    `--..--`

In [530]: a=a.splitlines()
In [531]: a
Out[531]: 
['    .--``--.',
 '.--`        `--.',
 '|              |',
 '|              |',
 '`--.        .--`',
 '    `--..--`']

(我的文本编辑器设置为剥离尾随空白,因此是粗糙的行)。

@DSM's建议:

In [556]: a=np.loadtxt('stack33655641.txt',dtype=bytes,delimiter='\n').astype(str)
In [557]: a
Out[557]: 
array(['    .--``--.', '.--`        `--.', '|              |',
       '|              |', '`--.        .--`', '    `--..--`'], 
      dtype='<U16')
In [558]: a.tolist()
Out[558]: 
['    .--``--.',
 '.--`        `--.',
 '|              |',
 '|              |',
 '`--.        .--`',
 '    `--..--`']

答案 1 :(得分:3)

您可以使用np.genfromtxt('your-file', dtype='U')

答案 2 :(得分:2)

Python3正在使用Unicode。将loadtxtdtype='S'一起使用时,我遇到了同样的问题。但是在dtype='UUnicode string中使用numpy.loadtxt作为numpy.genfromtxt,它会在没有b的情况下提供输出

a=numpy.loadtxt('filename',dtype={'names':('col1','col2','col3'),'formats':('U10','U10','i4')},delimiter=',')

print(a)

答案 3 :(得分:1)

这可能不是最“pythonic”或最佳解决方案,但绝对可以在python3中使用numpy.loadtxt完成工作。我知道这是一个“肮脏”的解决方案,但它适用于我。

import numpy as np
def loadstr(filename):
    dat = np.loadtxt(filename, dtype=str)
    for i in range(0,np.size(dat[:,0])):
        for j in range(0,np.size(dat[0,:])):
            mystring = dat[i,j]
            tick = len(mystring) - 1 
            dat[i,j] = mystring[2:tick]

    return (dat)

data = loadstr("somefile.txt")

这将通过numpy从文本文件导入2D数组,从每个字符串的开头和结尾剥离“b”和“'”,并返回名为“data”的剥离字符串数组。

有更好的方法吗?可能。

这有用吗?对。我使用它足以让我在自己的Python模块中使用这个函数。

答案 4 :(得分:0)

我有同样的问题,对我来说最简单的方法是使用csv库。 您可以通过以下方式获得所需的输出:

import csv
def loadFromCsv(filename):
    with open(filename,'r') as file:
        list=[elem for elem in csv.reader(file,delimiter='\n')]
    return list

a=loadFromCsv('tile')
print(a)