2015-11-11 3 views
9

Я попытался создать массив из текстового файла. я видел ранее, что NumPy был метод loadtxt, поэтому я стараюсь, но это добавить некоторые вредный символ перед каждой строкой ...Символ 'b' добавлен при использовании 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' `--..--` '"] 

Что это «б» и двойные кавычки? И откуда они взялись? Я попытался найти решение из Интернета, например, открыть файл с кодеками, изменить dtype на «S20», «S11» и многие другие вещи, которые не работают ... Что я ожидаю, это массив юникод строки, которые выглядят следующим образом:

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

Информация: Я использую Python 3.4 и NumPy из Debian стабильный репозиторий

+0

я уже перед приездом на этот вопрос, и, OK !, а для байта, но почему это _inside_ двойная кавычка? Я должен повторно использовать этот массив позже для замены некоторых символов в другом массиве, согласно индексу. Поэтому, если у меня есть b и 2 лишних простых кавычки, он сломает более позднюю программу. – krshk

+0

Почему вы используете 'loadtxt' для загрузки такого файла? 'loadtxt' предназначен для столбцов данных, разделенных запятыми или каким-либо другим разделителем. Вы можете так же легко прочитать этот файл с чистым python; например что-то вроде 'with open ('tile') как f: a = [line.strip ('\ n') для строки в f.readlines(), если не line.startswith ('#')]' –

+0

Простой: m - общий новичок в Python. Я начал использовать его в течение 1 недели. Я более точен на веб-языке. Поэтому мне кажется немного запутанным :) – krshk

ответ

11

np.loadtxt и np.genfromtxt работать в режиме байт, который является строковым типом по умолчанию в Python 2. Но Python 3 использует юникод и отмечает байты с этим 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]: 
[' .--``--.', 
'.--`  `--.', 
'|    |', 
'|    |', 
'`--.  .--`', 
' `--..--`'] 
+2

Я думаю 'np.loadtxt (" tile ", dtype = bytes, delimiter =" \ n "). Astype (str)' может работать, но я полностью согласен с точкой переполнения , – DSM

+0

Потрясающе! большое спасибо ! – krshk

1

Это, вероятно, не самый 'вещий' или лучшее решение, но, безусловно, получает работу с использованием numpy.loadtxt в Python3. Я знаю, что это «грязное» решение, но оно работает для меня.

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") 

Это будет импортировать 2D массив из текстового файла через NumPy, сдирать «Ъ«»и"»с самого начала и в конце каждой строки и возвращает раздел массив строк с именем„данные“ ,

Есть ли лучшие способы? Вероятно.

Это работает? Ага. Я использую его достаточно, чтобы у меня была эта функция в моем собственном модуле Python.

2

Вы можете использовать np.genfromtxt('your-file', dtype='U').

+0

Не забудьте указать длину строки 'dtype = 'U10'', так как без 10 вы просто получите пустую строку. – Hami

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) 
0

Это работает для меня (CSV-файлы):

np.genfromtxt('file.csv',delimiter=',', dtype=None).astype(str) 
Смежные вопросы