2016-12-28 6 views
3

以内リストに結果を一覧表示するCSVの変換[私はそれが収まるようにするために2つのスペースを投げた...]:私はリストに次のUnicode文字列を変換しようとしているリスト

"58478000","","NEW","2016-12-28T14:34:18","C","","","N","N","ON","2017-03-15","2022-03-15","30/360","EUR","IR","","InterestRate:IRSwap:FixedFloat","Trade","EUR-EURIBOR-Reuters","FIXED","Percent","-0.003","","","EUR","EUR","25,000,000","25,000,000","3M","1Y","3M","","","","","","","","","","","","",""

Iリストに、abc、上記の文字列を変換するには、次のコードを使用します。

csv.reader(abc, delimiter=',') 
details = list(csvreader) 

これは、このかかわらず、その結果、私は

...簡単 ['','']をドロップするように見えることはできません

[['58478000'], ['', ''], [''], ['', ''], ['NEW'], ['', ''],['2016-12-28T14:34:18'], ['', ''], ['C'], ['', ''], [''], ['', ''],[''], ['', ''], ['N'], ['', ''], ['N'], ['', ''], ['ON'], ['', ''],['2017-03-15'], ['', ''], ['2022-03-15'], ['', ''], [' 30/360'], ['',''], ['EUR'], ['', ''], ['IR'], ['', ''], [''], ['', ''],['InterestRate:IRSwap:FixedFloat'], ['', ''], ['Trade'], ['', ''],['EUR-EURIBOR-Reuters'], ['', ''], ['FIXED'], ['', ''], ['Percent'],['', ''], ['-0.003'], ['', ''], [''], ['', ''], [''], ['', ''],['EUR'], ['', ''], ['EUR'], ['', ''], ['25,000,000'], ['', ''],['25,000,000'], ['', ''], ['3M'], ['', ''], ['1Y'], ['', ''], ['3M'],['', ''], [''], ['', ''], [''], ['', ''], [''], ['', ''], [''], ['',''], [''], ['', ''], [''], ['', ''], [''], ['', ''], [''], ['', ''],[''], ['', ''], [''], ['', ''], [''], ['', ''], [''], ['', ''], ['']]

私の目標は、それが簡単にそれから情報を抽出することができ、リスト、またはその他のコレクションのいくつかの並べ替え、にこれを置くことです...

答えて

2

あなたが接近していました。そこdocumentation内の文字列のサポートについての何かです:

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

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

注文字列の周り[]が。これらの中括弧がなければ、csvモジュールは要素ごとに1行を返すようですが、それは文書化されていないようです。

私が最初にドキュメントから上の部分については知らなかったので、私の最初の「実用的」なアプローチは、リストの内包表記を使用して行の内側の要素を取ることだった。

import csv 

abc = '"58478000","","NEW","2016-12-28T14:34:18","C","","","N","N","ON","2017-03-15","2022-03-15","30/360","EUR","IR","","InterestRate:IRSwap:FixedFloat","Trade","EUR-EURIBOR-Reuters","FIXED","Percent","-0.003","","","EUR","EUR","25,000,000","25,000,000","3M","1Y","3M","","","","","","","","","","","","",""' 

csvreader=csv.reader(abc, delimiter=',') 
details = [x[0] for x in csvreader] 
print(details) 

利回り:

['58478000', '', '', '', 'NEW', '', '2016-12-28T14:34:18', '', 'C', '', '', '', '', '', 'N', '', 'N', '', 'ON', '', '2017-03-15', '', '2022-03-15', '', '30/360', '', 'EUR', '', 'IR', '', '', '', 'InterestRate:IRSwap:FixedFloat', '', 'Trade', '', 'EUR-EURIBOR-Reuters', '', 'FIXED', '', 'Percent', '', '-0.003', '', '', '', '', '', 'EUR', '', 'EUR', '', '25,000,000', '', '25,000,000', '', '3M', '', '1Y', '', '3M', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 

このアプローチでは、我々はは、空の文字列(つまり、単なる回避策です)を取り除くために必要があり我々は無傷でそれらを必要とする場合、我々はところで立ち往生している:

details = [x[0] for x in csvreader if x[0]] 

結果:

['58478000', 'NEW', '2016-12-28T14:34:18', 'C', 'N', 'N', 'ON', '2017-03-15', '2022-03-15', '30/360', 'EUR', 'IR', 'InterestRate:IRSwap:FixedFloat', 'Trade', 'EUR-EURIBOR-Reuters', 'FIXED', 'Percent', '-0.003', 'EUR', 'EUR', '25,000,000', '25,000,000', '3M', '1Y', '3M'] 

しかし、ドキュメントを読んだ後、これを行うための正しい方法は次のようになります。

import csv 

abc = '"58478000","","NEW","2016-12-28T14:34:18","C","","","N","N","ON","2017-03-15","2022-03-15","30/360","EUR","IR","","InterestRate:IRSwap:FixedFloat","Trade","EUR-EURIBOR-Reuters","FIXED","Percent","-0.003","","","EUR","EUR","25,000,000","25,000,000","3M","1Y","3M","","","","","","","","","","","","",""' 

csvreader=csv.reader([abc], delimiter=',') # pass a list of 1 element 
details = list(csvreader)[0] 
print(details) 

結果(空の文字列の数が今尊重されることに注意してください) :

['58478000', '', 'NEW', '2016-12-28T14:34:18', 'C', '', '', 'N', 'N', 'ON', '2017-03-15', '2022-03-15', '30/360', 'EUR', 'IR', '', 'InterestRate:IRSwap:FixedFloat', 'Trade', 'EUR-EURIBOR-Reuters', 'FIXED', 'Percent', '-0.003', '', '', 'EUR', 'EUR', '25,000,000', '25,000,000', '3M', '1Y', '3M', '', '', '', '', '', '', '', '', '', '', '', '', ''] 

空の文字列を削除したい場合は、

csvreader=csv.reader([abc], delimiter=',') 
details = [x for x in list(csvreader)[0] if x] 
print(details) 

結果:他のものよりもシンプルなリスト内包、

['58478000', 'NEW', '2016-12-28T14:34:18', 'C', 'N', 'N', 'ON', '2017-03-15', '2022-03-15', '30/360', 'EUR', 'IR', 'InterestRate:IRSwap:FixedFloat', 'Trade', 'EUR-EURIBOR-Reuters', 'FIXED', 'Percent', '-0.003', 'EUR', 'EUR', '25,000,000', '25,000,000', '3M', '1Y', '3M'] 
+0

こんにちは、私は今この応答をしようとしています。素晴らしい作品 - ありがとう! – keynesiancross

+0

あなたの編集に関して - 私はそれに従うかどうかわかりません。 x [0]が機能しない場合、元の詳細= c [x [0] for csvreader?それは私のために見えた – keynesiancross

+0

それは心配しないで動作します。私はただよりエレガントなものを探しています。 –

2

あなたはCSVの行を持っていたら、単純に(あなたのアプローチは、文字列の区切り文字として引用符を使用している要素としてコンマを避けリストを取得するには

result = abc.split(",") 

を使用することができ、それはそうです。

また、csvライブラリ自体を使用すると、this questionが役立ちます。

>>> import csv 

>>> with open(name, 'rb') as f: 
...  for row in csv.reader(abc, delimiter=',', skipinitialspace=True): 
...    result = row 

そしてそこに答えがthis answerは、あなたがリストとして行を取得すると言いながら、引用符は、自動的に扱われるべきであると言います!

+0

と何?直接 'abc'を渡すことは文書化されていない/サポートされていません。 –

+0

@ Jean-FrançoisFabreあなたの答えは本当に良いです。 :) – Alfabravo

+0

ありがとうございます。私はかなり長い間それに取り組んできました。 –

-1

string.split( '、')を試しましたか?

1

最初の入力が1つの文字列の場合は、ast.literal_eval()を使用することができます。

>>> import ast 
>>> 
>>> s = '"58478000","","NEW","2016-12-28T14:34:18","C","",""' 
>>> list(ast.literal_eval(s)) 
['58478000', '', 'NEW', '2016-12-28T14:34:18', 'C', '', ''] 

あなたの結果を平らにしたい場合は、あなたが使用することができますが:

>>> import itertools 
>>> 
>>> my_list = [['58478000'], ['', ''], [''], ['', ''], ['NEW'], ['', ''], ['2016-12-28T14:34:18'], ['', ''], ['C'], ['', ''], ['']] 
>>> 
>>> list(itertools.chain.from_iterable(my_list)) 
['58478000', '', '', '', '', '', 'NEW', '', '', '2016-12-28T14:34:18', '', '', 'C', '', '', ''] 
2

あなただけの1つの文字列を持っている、あなたはlistのように、反復可能で、それを配置する必要があり、そうcsv.readerが読み込まれますので、それは適切です。

import csv 

abc = (u'"58478000","","NEW","2016-12-28T14:34:18","C","","","N","N","ON",' 
     u'"2017-03-15","2022-03-15","30/360","EUR","IR","",' 
     u'"InterestRate:IRSwap:FixedFloat","Trade","EUR-EURIBOR-Reuters","FIXED",' 
     u'"Percent","-0.003","","","EUR","EUR","25,000,000","25,000,000","3M",' 
     u'"1Y","3M","","","","","","","","","","","","",""') 

reader = csv.reader([abc], delimiter=',') 
details = next(reader) # read and process single line that is in list [abc] 
print(details) 

出力:いくつかの要素にカンマが含まれている場合

['58478000', '', 'NEW', '2016-12-28T14:34:18', 'C', '', '', 'N', 'N', 'ON', '2017-03-15', '2022-03-15', '30/360', 'EUR', 'IR', '', 'InterestRate:IRSwap:FixedFloat', 'Trade', 'EUR-EURIBOR-Reuters', 'FIXED', 'Percent', '-0.003', '', '', 'EUR', 'EUR', '25,000,000', '25,000,000', '3M', '1Y', '3M', '', '', '', '', '', '', '', '', '', '', '', '', '']

+0

こんにちは、これを試してみると「58478000」しかありません – keynesiancross

+0

私は言うことができません(どちらもPython 2と3のどちらでも)。おそらくあなたは私の答えにあるコードから何かを外したでしょう。 'reader = csv.reader([abc]、delimiter = '、')'という行があることを確認してください。 '[abc]'部分は重要です。 – martineau

+0

あなたは何を知っています。文字列の余分な[] – keynesiancross

関連する問題