numpy.genfromtxt
でcsvファイルを読み取ろうとしていますが、一部のフィールドはコンマを含む文字列です。文字列は引用符で囲まれていますが、numpyは引用符を単一の文字列の定義として認識していません。たとえば、「t.csv」のデータの場合:
2012, "Louisville KY", 3.5
2011, "Lexington, KY", 4.0
コード
np.genfromtxt('t.csv', delimiter=',')
エラーが発生します:
ValueError:いくつかのエラーが検出されました!行2(3列ではなく4列)
私が探しているデータ構造は次のとおりです。
array([['2012', 'Louisville KY', '3.5'],
['2011', 'Lexington, KY', '4.0']],
dtype='|S13')
ドキュメントを見ても、これに対処するオプションはありません。 numpyでそれを行う方法はありますか、またはcsv
モジュールでデータを読み込み、それをnumpy配列に変換するだけですか?
このために pandas (科学的なpythonでデータフレーム(異種データ)を操作するためのデフォルトのライブラリになります)を使用できます。 read_csv
はこれを処理できます。ドキュメントから:
quotechar:文字列
The character to used to denote the start and end of a quoted item. Quoted items can include the delimiter and it will be ignored.
デフォルト値は"
です。例:
In [1]: import pandas as pd
In [2]: from StringIO import StringIO
In [3]: s="""year, city, value
...: 2012, "Louisville KY", 3.5
...: 2011, "Lexington, KY", 4.0"""
In [4]: pd.read_csv(StringIO(s), quotechar='"', skipinitialspace=True)
Out[4]:
year city value
0 2012 Louisville KY 3.5
1 2011 Lexington, KY 4.0
ここでのコツは、skipinitialspace=True
を使用して、コンマ区切り文字の後のスペースを処理する必要があることです。
強力なcsvリーダーとは別に、あなたが持っている異種データでpandasを使用することを強くアドバイスできます(numpyの出力例はすべて構造化配列を使用できますが、文字列です)。
追加のコンマである_np.genfromtxt
_の問題はそれを処理しません。
簡単な解決策の1つは、csv.reader()
を使用してpythonの csv モジュールからファイルをリストに読み取り、必要に応じてnumpy配列にダンプすることです。
本当に_np.genfromtxt
_を使用する場合は、ファイルの代わりにイテレータを使用できることに注意してください。 np.genfromtxt(my_iterator, ...)
。したがって、イテレータで_csv.reader
_をラップし、_np.genfromtxt
_に渡すことができます。
それは次のようになります:
_import csv
import numpy as np
np.genfromtxt(("\t".join(i) for i in csv.reader(open('myfile.csv'))), delimiter="\t")
_
これは基本的に、適切なコンマのみをオンザフライでタブに置き換えます。
Numpyを使用している場合は、おそらくnumpy.ndarrayを使用したいでしょう。これにより、numpy.ndarrayが得られます。
import pandas
data = pandas.read_csv('file.csv').as_matrix()
パンダは「レキシントン、ケンタッキー州」のケースを正しく処理します
標準の csv
module とNumpyのrecfromcsv
の能力を組み合わせたより良い関数を作成します。たとえば、csv
モジュールには、方言、引用符、エスケープ文字などを適切に制御およびカスタマイズできる機能があり、以下の例に追加できます。
例 genfromcsv_mod
関数は、Microsoft Excelに表示されるものと同様の複雑なCSVファイルを読み込みます。引用符で囲まれたフィールド内にコンマが含まれている場合があります。内部的に、この関数には、各行をタブ区切り文字で書き換えるジェネレーター関数があります。
import csv
import numpy as np
def recfromcsv_mod(fname, **kwargs):
def rewrite_csv_as_tab(fname):
with open(fname, 'rb') as fp:
reader = csv.reader(fp)
for row in reader:
yield '\t'.join(row)
return np.recfromcsv(rewrite_csv_as_tab(fname), delimiter='\t', **kwargs)
# Use it to read a CSV file into a record array
x = recfromcsv_mod('t.csv', case_sensitive=True)