2016-06-13 18 views
2

でCSVを読んで二重引用符で改行Iは、次の形式のCSVファイルを有する:上記のデータは、4列の3行として読まれるべきであるパイソン

"4931286","Lotion","New York","Bright color, yellow with 5" long 
20% nylon" 
"931286","Shampoo","New York","Dark, yellow with 10" long 
20% nylon" 
"3931286","Conditioner","LA","Bright color, yellow with 5" long 
50% nylon" 

を:ID、製品名、場所、および説明。見ることができるように、各行の説明に改行があります。

他の関連するスタックオーバーフローに関する質問を検索していますが、解決策のいずれもこの問題を解決していないようです。

from StringIO import StringIO 
file = StringIO("""4931286","Lotion","New York","Bright color, yellow\n with 5" long 20% nylon""") 

for row in csv.reader(file,quotechar='"', delimiter=',',quoting=csv.QUOTE_ALL, skipinitialspace=True): 
print row 

そして、結果は見て、次の:私は

['4931286"', 'Lotion', 'New York', 'Bright color, yellow with 5 long 20% nylon'] 

がどのように私はこれを達成できている何をしたい

['4931286"', 'Lotion', 'New York', 'Bright color, yellow with 5 long'] 
    ['20% nylon'] 

しかし、ここで

は私の試みですか? Pythonには方法があるはずですか?

+0

私は、適切にフォーマットされたCSVファイルを持っていて、そのファイルを解析するか、ハックしようとしている可能性があり、特定のケースに対して別の解析機能を記述する必要があります。 – zoubida13

+0

パンダはどのように関連していますか?あなたのデータはパンダから来ていますか?もしそうなら、私はあなたのCSVが有効ではないと言った他の人に同意するので、私は驚いています。私はあなたが持っているもののようなデータをパンダが作り出すとは期待していません。私はあなたのデータをそのまま正確に扱えるように組み込みの 'csv'モジュールの方言設定の組み合わせを見つけることはできません。 –

+0

ああ、混乱のために申し訳ありません。データは、SQL Workbenchを使用したSQLデータベースからのものです。私はpandasのタグを含んでいました。pandasの方法があるかもしれない場合に備えて、pandas.read_csv関数はそれを解決することができるかもしれません。 – user4279562

答えて

1

はどのようにすべての二行を反復処理について、

import csv 
from StringIO import StringIO 
from itertools import izip 

def pairwise(iterable): 
    "s -> (s0, s1), (s2, s3), (s4, s5), ..." 
    a = iter(iterable) 
    return izip(a, a) 


file = StringIO(""""4931286","Lotion","New York","Bright color, yellow with 5" long 
20% nylon" 
"931286","Shampoo","New York","Dark, yellow with 10" long 
20% nylon" 
"3931286","Conditioner","LA","Bright color, yellow with 5" long 
50% nylon" 
""") 

reader = csv.reader(file,quotechar='"', delimiter=',',quoting=csv.QUOTE_ALL, skipinitialspace=True) 
for row, row2 in pairwise(reader): 
    row[-1] = ' '.join([row[-1], row2[0]]) 
    print(row) 

# Output 
['4931286', 'Lotion', 'New York', 'Bright color, yellow with 5 long 20% nylon"'] 
['931286', 'Shampoo', 'New York', 'Dark, yellow with 10 long 20% nylon"'] 
['3931286', 'Conditioner', 'LA', 'Bright color, yellow with 5 long 50% nylon"'] 
3

データはCSV形式ではありません。

"\のように"Bright color, yellow\n with 5\" long 20% nylon"でエスケープする必要があります。

"た場合にのみ(番号で始まる)インチのために使用され、この試してみてください。この正規表現は、それが数

が前置されている場合\"を持つすべての"を交換し、データを解析します

import re 
data = re.sub(r'([0-9])"(?![,\n])', r'\1\\"', data) 

をwith csv.reader

編集:MaxU's suggestionのために正規表現が変更されました。

+0

私は、あなたがこのような文字列をエスケープしないようにする必要があると思います: '' Column 1 ''、 'Column 2' '、I。 ''の後に '[、\ n]'がある場合、エスケープしないでください。 – MaxU

+0

@MaxUありがとう、編集しました –

+0

ありがとうございましたこれは良いラウンドアバウトです – user4279562