2017-12-03 1 views
0

Ich versuche, eine Datei mit Daten für verschiedene Daten zu lesen mit numpy.genfromtxt() in Python3. Die Datei sieht im Grunde wieLoading UTF-8-Datei in Python 3 mit numpy.genfromtxt()

Date,Open,High,Low,Close,Volume 
1-Apr-15,108.33,108.66,108.33,108.66,290 

aber enthalten fehlt als - markiert Werte.

Der folgende Code funktioniert in python2 feinen

str2date = lambda x: datetime.strptime(x, '%d-%b-%y').strftime('%Y-%m-%d') 
data = np.genfromtxt('test.dat', dtype="S9,f8,f8,f8,f8,f8", delimiter=',', names=True, missing_values='-', converters={0: str2date}) 

aber nicht in python3 mit

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

locale.getpreferredencoding(False) kehrt UTF-8 als Standard-Codierung und die vorgeschlagene Lösung, die durch die Codierung für die Eingangseinstellung Strom vorgeschlagen zum Beispiel here ist ein bisschen schwierig. Ich habe auch versucht, die encoding of the terminal ohne Erfolg einzustellen. Ich muss auch zugeben, dass ich in this answer keine Lösung für mein Problem sehe, da in der Datei keine Sonderzeichen enthalten sind - oder zumindest sehe ich sie nicht.

Wie kann ich dieses Problem lösen, ohne auf python2 zurückzugehen?

+0

Es scheint, dass genfromtxt für nicht definierte Grund im ASCII-Modus fällt .... haben Sie genfromtxt versucht (open ('test.dat', encoding = 'utf-8'), ... oder effizienter, pandas.read_csv? –

+0

'genfromtxt (offen ('test.dat', encoding = 'utf-8')) 'beschwert sich über Bytes bietet statt einer Zeichenfolge. Aber Pandas funktioniert wie ein Charme. Danke :). Du stellst das in eine Antwort, ich werde es akzeptieren. – Martin

+0

'genfromtxt' öffnet die Datei im Binärmodus und arbeitet mit Bytestrings (Py3). Die "Konverter" -Lösung in https://stackoverflow.com/questions/33001373/loading-utf-8-file-in-python-3-using-numpy-genfromtxt hilft nicht? – hpaulj

Antwort

0

Wenn ich versuche, den Code zu reproduzieren ich Probleme mit der Datumsumstellung erhalten:

Out[405]: b'1-Apr-15' 
In [406]: str2date(_) 
--------------------------------------------------------------------------- 
... 
----> 1 str2date = lambda x: datetime.strptime(x, '%d-%b-%y').strftime('%Y-%m-%d') 

TypeError: strptime() argument 1 must be str, not bytes 

Wenn ich hinzufügen, ein decode:

def foo(x): 
    return str2date(x.decode()) 

der Konverter die Bytestring Handles, genfromtxt beharrt auf die Bereitstellung von .

In [410]: data = np.genfromtxt('stack47619155.txt', dtype="S9,f8,f8,f8,f8,f8", 
    ...: delimiter=',', names=True, missing_values='-', converters={0: foo}) 
In [411]: data 
Out[411]: 
array([(b'2015-04-0', 108.33, 108.66, 108.33, 108.66, 290.), 
     (b'2015-04-0',  nan, 108.66,  nan, 108.66, 290.), 
     (b'2015-04-0', 108.33, 108.66, 108.33, 108.66, nan)], 
     dtype=[('Date', 'S9'), ('Open', '<f8'), ('High', '<f8'), ('Low', '<f8'), ('Close', '<f8'), ('Volume', '<f8')]) 
In [412]: data = np.genfromtxt('stack47619155.txt', dtype="U9,f8,f8,f8,f8,f8", 
    ...: delimiter=',', names=True, missing_values='-', converters={0: foo}) 
In [413]: data 
Out[413]: 
array([('2015-04-0', 108.33, 108.66, 108.33, 108.66, 290.), 
     ('2015-04-0',  nan, 108.66,  nan, 108.66, 290.), 
     ('2015-04-0', 108.33, 108.66, 108.33, 108.66, nan)], 
     dtype=[('Date', '<U9'), ('Open', '<f8'), ('High', '<f8'), ('Low', '<f8'), ('Close', '<f8'), ('Volume', '<f8')]) 

Es ist ein anderer Fehler, so dass ich kann eine anderes - als der fehlenden Feldmarker oder nicht benutzt haben.

gefunden Sie meinen Beitrag von ein paar Jahren mit einer decode in den Konvertern:

Loading UTF-8 file in Python 3 using numpy.genfromtxt

+0

Das 'decode()' wird in python2 benötigt. Für Python3 wirft es einen Fehler (auf meinem System). Die Konvertierung selbst ohne 'decode()' läuft dort gut 'print (str2date (' 1-Apr-15 ')) '. – Martin

+0

Wie wäre es mit 'print (str2date (b'1-Apr-15 '))'? – hpaulj

+0

Dann brauche ich das 'decode', wahr. Aber 'genfromtxt' versagt immer noch mit dem' ascii' Problem. – Martin