簡體   English   中英

使用numpy.genfromtxt()在Python 3中加載UTF-8文件

[英]Loading UTF-8 file in Python 3 using numpy.genfromtxt()

我正在嘗試在python3中使用numpy.genfromtxt()讀取包含不同日期數據的文件。 該文件基本上看起來像

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

但可能包含標記為-缺失值。

以下代碼在python2中工作正常

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

但在python3中失敗

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

locale.getpreferredencoding(False)返回UTF-8作為默認編碼,並且通過為建議的輸入流設置編碼來建議解決方案,例如, 此處有點棘手。 我也嘗試設置終端編碼沒有成功。 我還必須承認,由於文件中不包含特殊字符,因此我在此答案中看不到解決問題的方法,或者至少我看不到它們。

我如何解決這個問題而又不退回到python2?

當我嘗試重現您的代碼時,日期轉換出現問題:

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

如果我添加一個decode

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

轉換器處理genfromtxt堅持提供的字節字符串。

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')])

這是一個不同的錯誤,所以我可能使用了一個不同的-作為是否缺少字段標記。

您發現了我幾年前在轉換器中decode帖子:

使用numpy.genfromtxt在Python 3中加載UTF-8文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM