配列へのPython csv文字列


187

csvエンコードされた文字列を解析して配列または辞書に変換する単純なライブラリまたは関数を知っている人はいますか?

私が見たすべての例で、文字列ではなくファイルパスを使用するため、組み込みのcsvモジュールが必要だとは思いません。

回答:


259

を使用して文字列をファイルオブジェクトに変換しio.StringIO、それをcsvモジュールに渡すことができます。

from io import StringIO
import csv

scsv = """text,with,Polish,non-Latin,letters
1,2,3,4,5,6
a,b,c,d,e,f
gęś,zółty,wąż,idzie,wąską,dróżką,
"""

f = StringIO(scsv)
reader = csv.reader(f, delimiter=',')
for row in reader:
    print('\t'.join(row))

split()改行付きのシンプルなバージョン:

reader = csv.reader(scsv.split('\n'), delimiter=',')
for row in reader:
    print('\t'.join(row))

または、split()この文字列を\nセパレータとして使用して行に単純化し、split()各行を値に変換することもできますが、この方法では引用符に注意する必要があるため、csvモジュールを使用することをお勧めします。

のPython 2インポートする必要がありますStringIOように

from StringIO import StringIO

代わりに。


6
彼のcsvファイルにコンマを含む文字列が含まれている場合、splitメソッドは機能しませんでした
Carson Myers

3
または値としての引用符付き文字列(コンマの有無にかかわらず)
adamk '22

28
Python 3でio.StringIOが使用されるようになりました。(願わくば、Python 3ユーザーを少し時間を節約できます)。ioとio.StringIOをインポートします。
JStrahl

3
の代わりに.split('\n')、を使用できます.splitlines()
DenilsonSáMaia 2014

1
いいえ、それはogonkiとポーランドの文字:-)で非常にうまく機能
のMichałニクラス

70

シンプル-csvモジュールはリストでも動作します:

>>> a=["1,2,3","4,5,6"]  # or a = "1,2,3\n4,5,6".split('\n')
>>> import csv
>>> x = csv.reader(a)
>>> list(x)
[['1', '2', '3'], ['4', '5', '6']]

4
知っておくと.split('\n')便利ですが、フィールドに改行が含まれている場合は、奇妙なことが行われることに注意してください。
イナイマティ2013

1
@ Inaimathi、csvの場合、内部の改行はエスケープする必要があります。
John La Rooy、2015

フィールドが引用符で囲まれている場合、改行をエスケープする必要はありません。
Jonathan Stray

1
この機能は十分に文書化されていません。ありがとうございました。
カウリネーター

13

csv.reader() https://docs.python.org/2/library/csv.htmlの公式ドキュメント は非常に役立ちます。

ファイルオブジェクトとリストオブジェクトの両方が適しています

import csv

text = """1,2,3
a,b,c
d,e,f"""

lines = text.splitlines()
reader = csv.reader(lines, delimiter=',')
for row in reader:
    print('\t'.join(row))

11
>>> a = "1,2"
>>> a
'1,2'
>>> b = a.split(",")
>>> b
['1', '2']

CSVファイルを解析するには:

f = open(file.csv, "r")
lines = f.read().split("\n") # "\r\n" if needed

for line in lines:
    if line != "": # add other needed checks to skip titles
        cols = line.split(",")
        print cols

「シンプルは複雑よりも優れています!」
Abdelouahab 14

9
-1このソリューションの問題は、「文字列のエスケープ」を考慮しないことです。つまり3, "4,5,6, 6、5つのフィールドではなく3つのフィールドとして扱われます。
Zz'Rot 2016

シンプルですが、一部の特定のケースでのみ機能します。これは、一般的なCSV解析コードではありません
Christophe Roussy

8

他の人がすでに指摘したように、PythonにはCSVファイルを読み書きするためのモジュールが含まれています。入力文字がASCIIの制限内にある限り、うまく機能します。他のエンコーディングを処理する場合は、さらに作業が必要です。

csvモジュールPythonドキュメントは、 csv.readerの拡張機能を実装します。これは、同じインターフェイスを使用しますが、他のエンコーディングを処理し、Unicode文字列を返すことができます。ドキュメントからコードをコピーして貼り付けるだけです。その後、次のようにCSVファイルを処理できます。

with open("some.csv", "rb") as csvFile: 
    for row in UnicodeReader(csvFile, encoding="iso-8859-15"):
        print row

UnicodeファイルにBOM(バイトオーダーマーカー)がないことを確認します
Pierre

1
BOMについて:Pythonは、UTF-32、UTF-16などの公式BOMを検出してスキップする必要があります。UTF-8の非公式Microsoft BOMをスキップするには、の'utf-8-sig'代わりにコーデックとして使用し'utf-8'ます。
roskakori 2014

7

ドキュメントごと

そして、モジュールは文字列の解析を直接サポートしていませんが、簡単に行うことができます:

import csv
for row in csv.reader(['one,two,three']):
    print row

文字列を単一の要素リストに変えるだけです。

この例が明示的にドキュメントにある場合、StringIOのインポートは私には少し過剰に思えます。



2

これが代替ソリューションです:

>>> import pyexcel as pe
>>> text="""1,2,3
... a,b,c
... d,e,f"""
>>> s = pe.load_from_memory('csv', text)
>>> s
Sheet Name: csv
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| a | b | c |
+---+---+---+
| d | e | f |
+---+---+---+
>>> s.to_array()
[[u'1', u'2', u'3'], [u'a', u'b', u'c'], [u'd', u'e', u'f']]

ここにドキュメントがあります


2

これを使用してcsvをリストにロードします

import csv

csvfile = open(myfile, 'r')
reader = csv.reader(csvfile, delimiter='\t')
my_list = list(reader)
print my_list
>>>[['1st_line', '0'],
    ['2nd_line', '0']]

0

パンダはPythonでCSVを読み取る非常に強力でスマートなライブラリです

ここでの簡単な例では、4つのファイルが含まれるexample.zipファイルがあります。

EXAMPLE.zip
 -- example1.csv
 -- example1.txt
 -- example2.csv
 -- example2.txt

from zipfile import ZipFile
import pandas as pd


filepath = 'EXAMPLE.zip'
file_prefix = filepath[:-4].lower()

zipfile = ZipFile(filepath)
target_file = ''.join([file_prefix, '/', file_prefix, 1 , '.csv'])

df = pd.read_csv(zipfile.open(target_file))

print(df.head()) # print first five row of csv
print(df[COL_NAME]) # fetch the col_name data

データを取得したら、リストやその他の形式で操作することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.