2016-12-02 1 views
1

이 질문은 StackOverflow의 첫 번째 질문이므로 질문을 명확하게 작성하는 방법에 대한 제안은 언제나 환영합니다. 나는 부동 개체의 두 개의 열로 형태의 문자열을 변환하는 것을 시도하고,petl을 사용하여 문자열을 튜플로 변환

OBJECTID,CART_ID,SHAPE 
1,ABC,"(1.2, -4.5)" 
2,ABD,"(3.8, 9.1)" 

파이썬 3.5에서 petl 모듈 사용 :

나는 같은 구조를 CSV 포인트의 데이터가 다음과 같이 있습니다. petl 설명서에서 내가 이해 한 것을 사용하여 세 단계로 수행 할 수 있어야합니다.

  1. 열고 CSV : 문자열에서 튜플에 a = petl.fromcsv('file.csv')
  2. 변환 SHAPE : c = petl.unpack(b, 'SHAPE', ['LAT', 'LON']

내가 이것을 할 생각 : 스플릿) (.unpack 사용하여 두 개의 컬럼으로 튜플

  • b = petl.convert(a, 'SHAPE', tuple) 그러면 다음과 같은 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', ')') 
    

    어떤 도움을 켜짐)하고, 또는 b) 어떻게 CSV를 재구성하는 평가 될 것입니다 무엇 .convert().

    감사합니다.

    전체 코드 :

    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라는 이름의이 새 열을 만들 수 있지만 그들이 strin 될해야합니다 capture와 정규 표현식을 사용 gs이므로 변환 후에는 변환을 사용해야 할 수도 있습니다.

    약간 더 "악"접근 방식은 표현이 두 개의 수레와 튜플 유효 파이썬 것을 실현하는 것입니다, 그래서 당신은 말할 단지 수 :

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

    는'ast.literal_eval'이 덜 악을 만들 것 :피 –

    관련 문제