2015-11-11 23 views
9

Ho provato a creare un array da un file di testo. Ho visto in precedenza che aveva NumPy un metodo loadtxt, così ho provato, ma aggiungo qualche personaggio spazzatura prima di ogni fila ...carattere 'b' aggiunto quando si utilizza 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' `--..--` '"] 

Quali sono questi 'b' e le doppie virgolette? E da dove vengono? Ho provato una soluzione scelta da internet, come aprire il file con i codec, cambiare il dtype con 'S20', 'S11' e molte altre cose che non funzionano ... Quello che mi aspetto è una serie di stringhe Unicode che assomigliano a questo:

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

Info: sto usando Python 3.4 e numpy dal debian repository stabile

+0

ho già controllare questa domanda prima, e, OK !, b è per byte, ma perché è _inside_ una stringa doppia citazione? Devo riutilizzare questo array in seguito per sostituire alcuni caratteri in un altro array, secondo un indice. Quindi se ho un b e 2 citazioni semplici extra, si romperà il programma successivo. – krshk

+0

Perché stai usando 'loadtxt' per caricare un file del genere? 'loadtxt' è progettato per colonne di dati separate da virgole o qualche altro delimitatore. Si potrebbe leggere facilmente quel file con Python puro; per esempio. qualcosa come 'con open ('tile') come f: a = [line.strip ('\ n') per la riga in f.readlines() se non line.startswith ('#')]' –

+0

Semplice: I ' m un principiante assoluto in Python. Ho iniziato a usarlo per 1 settimana. Sono più preciso nel linguaggio web. Quindi mi sembra un po 'confuso :) – krshk

risposta

11

np.loadtxt e np.genfromtxt operano in modalità di byte, che è il tipo stringa di default in Python 2. Ma Python 3 usa unicode e contrassegna i brani con questo b.

Ho provato alcune varianti, in una sessione 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 con dtype=str dà display pulita - tranne le strisce sbozzati. Potrei dover usare un convertitore per disattivarlo. Queste funzioni hanno lo scopo di leggere i dati csv dove gli spazi (bianchi) sono separatori, non parte dei dati.

loadtxt e genfromtxt sono over kill per testo semplice come questo. Una lettura normale file fa bene:

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]: 
[' .--``--.', 
'.--`  `--.', 
'|    |', 
'|    |', 
'`--.  .--`', 
' `--..--`'] 

(il mio editor di testo è impostato per togliere gli spazi finali, da qui la linee sfilacciate).


@DSM's suggerimento:

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

Penso che 'np.loadtxt (" tile ", dtype = bytes, delimitatore =" \ n "). Astype (str)' potrebbe funzionare, ma sono completamente d'accordo con il punto di overkill . – DSM

+0

Fantastico! molte grazie ! – krshk

1

Questo non è probabilmente la soluzione più 'divinatorio' o migliore, ma sicuramente ottiene il lavoro fatto utilizzando numpy.loadtxt in python3. Sono consapevole che si tratta di una soluzione "sporca", ma funziona per me.

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

Ciò importare una matrice 2D da un file di testo tramite NumPy, togliere la "b '" e "'" dall'inizio e alla fine di ogni stringa, e restituire un array di stringhe spogliato denominata 'Dati' .

Ci sono modi migliori? Probabilmente.

Funziona? Sì. Lo uso abbastanza da avere questa funzione nel mio modulo Python.

2

È possibile utilizzare np.genfromtxt('your-file', dtype='U').

+0

Non dimenticare di specificare una lunghezza della stringa 'dtype = 'U10'', in quanto senza la 10 otterrai una stringa vuota. – Hami

0

Ho avuto lo stesso problema e per me il modo più semplice è quello di utilizzare la libreria csv. si ottiene il risultato desiderato da:

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

Questo funziona per me (file CSV):

np.genfromtxt('file.csv',delimiter=',', dtype=None).astype(str)