我尝试从文本文件创建一个数组。
我之前看到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
答案 0 :(得分:14)
np.loadtxt
和np.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
数据,其中(白色)空格是分隔符,而不是数据的一部分。
loadtxt
和genfromtxt
过度杀戮。普通文件读取很好:
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。将loadtxt
与dtype='S'
一起使用时,我遇到了同样的问题。但是在dtype='U
或Unicode 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)