2016-03-06 8 views
5

csv.reader(..)のような空想を使用せずにカンマ区切り文字列を1つ解析する方法はありますか? split(',')関数を使用できますが、有効な列の値にカンマ自体が含まれている場合は機能しません。 csvライブラリには、前述の特別なケースを正しく処理するCSVファイルを解析するためのリーダーがありますが、単一の文字列を解析する必要があるため、これらを使用することはできません。しかし、Python CSVで1つの文字列を解析することができれば、それは私にとっては朗報です。単一のCSV文字列を解析しますか?

答えて

11

:(もメモリファイルとして知られている)文字列bufferを書くためにStringIOを使用持っている文字列:

>>> s = '"this is", "a test", "of the csv", "parser"' 

そして、あなたは "各 の反復の入力」、あなただけのリストにあなたの文字列をラップすることができます

>>> r = csv.reader([s]) 
>>> list(r) 
[['this is', 'a test', 'of the csv parser']] 

そして、それはあなたがcsvモジュールで文字列を解析する方法です。

+0

私はそれがより使いやすいと思います'[s]'(リストを指定する)の代わりに一般的なイテレータとして 'iter(s)'を実行します。しかし、あなたは私の+1を持っています – RafaelC

+0

これはおそらく文字列が値の中で改行を引用符で囲んだ場合には機能しません。 @アレクセーの答えはもっと意味がある – swooby

9

csvで1つの文字列を解析することはできます。

reader(...) 
    csv_reader = reader(iterable [, dialect='excel'] 
          [optional keyword args]) 
     for row in csv_reader: 
      process(row) 

    The "iterable" argument can be any object that returns a line 
    of input for each iteration, such as a file object or a list. The 
    optional "dialect" parameter is discussed below. The function 
    also accepts optional keyword arguments which override settings 
    provided by the dialect. 

をだから場合: が言うcsvモジュールのドキュメント、詳しく見てみ

import csv 
from StringIO import StringIO 

s = "your string" 
buff = StringIO(s) 

reader = csv.reader(buff) 
for line in reader: 
    print(line) 
+0

Python 3の場合、 'from io import StringIO'を参照してください。[here](https://docs.python.org/3/library/io.html#text-io)を参照してください。 –