2016-12-02 10 views
1

これは、StackOverflowの最初の質問です。質問を明確にする方法の提案はいつでも歓迎します。petlを使用して文字列をタプルに変換する

私は、以下に示すように構成されたポイントデータのCSVを持っている:

のpython 3.5でPETLモジュールを使用して
OBJECTID,CART_ID,SHAPE 
1,ABC,"(1.2, -4.5)" 
2,ABD,"(3.8, 9.1)" 

、私は、フロートオブジェクトの二つの別々の列にSHAPEの文字列を変換しようとしています。私がpetlのドキュメントから理解したことを使用して、私は3つのステップでそれを行うことができるはずです。私はこれが信じたc = petl.unpack(b, 'SHAPE', ['LAT', 'LON']

  1. オープンCSV:a = petl.fromcsv('file.csv')
  2. タプルに文字列からSHAPEを変換しますb = petl.convert(a, 'SHAPE', tuple)
  3. スプリット(.unpack使用して2列にタプル) CSVファイルは次のようになります。

    OBJECTID,CART_ID,LAT,LON 
    1,ABC,1.2,-4.5 
    2,ABD,3.8,9.1 
    

    代わりに、.convertは、()生産:

    OBJECTID,CART_ID,SHAPE 
    1,ABC,('(', '1', '.', '2', ',', ' ', '-', '4', '.', '5', ')') 
    

    a)は何.convert()やっている、またはb)CSVを再構築する方法上の任意のヘルプはいただければ幸いです。

    ありがとうございます。

    全コード:

    import petl 
    a = petl.fromcsv('file.csv') 
    petl.look(a) 
    b = petl.convert(a, 'SHAPE', tuple) 
    petl.look(b) 
    c = petl.unpack(b, 'SHAPE', ['LAT', 'LON'] 
    petl.look(c) 
    

答えて

1

あなたはPETL expectsとして化合物テーブルを持っていない、あなたはまだ文字列を持っています。あなたはそれを解釈するために、異なる関数に渡す必要があります。ast.literal_eval()

>>> ast.literal_eval('(1, 2)') 
(1, 2) 

統合をPETLに読者の練習として残しています。

0

Ignacioが述べたように、文字列データを分割する必要があります。これは、strip()split()を使用するか、最終列の内容を安全に評価するためにast.literal_eval()を使用することが推奨されます。

次の例ではこれを利用しています。あなただけの可能性、PETLを使用して

OBJECTID,CART_ID,LAT,LON 
1,ABC,1.2,-4.5 
2,ABD,3.8,9.1 
0

:ように見えるoutput.csvあなたに与える

import csv 
import ast 

with open('input.csv', newline='') as f_input, open('output.csv', 'w', newline='') as f_output: 
    csv_input = csv.reader(f_input) 
    csv_output = csv.writer(f_output) 
    csv_output.writerow(next(csv_input)[:2] + ['LAT', 'LON']) 

    for row in csv_input: 
     csv_output.writerow(row[:2] + list(ast.literal_eval(row[2]))) 

:それは、あなたのCSVがでファイルを読み込み、その構成部分に最後の列を分割し、新しい出力CSVファイルを作成します

b = petl.capture(a, 'SHAPE', r'\(\s*([-0-9.]+)\s*,\s*([-0-9.]+)\s*\)', ['LAT', 'LON']) 
c = petl.convert(b, ['LAT', 'LON'], float) 

これは数字を検出し、LATおよびLONという名前の2つの新しい列を作成し、彼らはstrinことになる必要があります:captureと正規表現を使用しますgsので、後に変換するためにconvertを使用する必要があります。

Aあなただけの言うことができるので、もう少し「悪」のアプローチは、式は2つのfloatを持つタプルのための有効なPythonであることを実現するために、次のようになります。

b = petl.convert(a, 'SHAPE', eval) 
c = petl.unpack(b, 'SHAPE', ['LAT', 'LON']) 
+0

'ast.literal_eval'が、それはあまり悪になるだろう:P –

関連する問題