2013-01-04 2 views
0

다음과 같은 (비교적 간단한) 문제로 고민하고 있습니다. 나는 다음과 같은 방법으로 사용하는 것을 시도하고있다Python MySQLdb는 SELECT에서 CSV 출력을위한 목록 데이터를 변환합니다.

select * from extension_recording where filename = "20091030_135711-out.wav"; 
+----+--------------+------+-------------------------+----------+--------+--------------------+---------------------------+--------+-----------------+------+-------+ 
| id | extension_id | flow | filename    | filesize | unread | cr_date    | callerid     | length | callid   | info | party | 
+----+--------------+------+-------------------------+----------+--------+---------------------+---------------------------+--------+-----------------+------+-------+ 
| 1 |   41 | out | 20091030_135711-out.wav | 264684 | 1  | 2009-10-30 13:57:31 | Some user <01273123456> |  20 | 1256911031.5482 |  | NULL | 
+----+--------------+------+-------------------------+----------+--------+---------------------+---------------------------+--------+-----------------+------+-------+ 

: 나는 다음과 같은 데이터를 반환 MySQLdb에서 SELECT 쿼리를 사용하고있다

cur.execute ("SELECT * FROM extension_recording WHERE filename = %s;", (file)) 
csv_result = cur.fetchone() 
csv_list.append ([csv_result]) 

이 파이썬 데이터 유형 목록에서 결과 :

print csv_list 
(1L, 41L, 'out', '20091030_135711-out.wav', 264684L, '1', datetime.datetime(2009, 10, 30, 13, 57, 31), 'Some user <01273123456>', 20L, '1256911031.5482', '', None) 

데이터를 CSV 형식으로 MySQL 데이터 형식으로 출력해야하므로 각 필드를 적절하게 변환해야합니다. 즉, id 및 extension_id 필드를 long으로 변환하지 않고 int로 변환해야합니다. 날짜를 문자열로.

1,41,'out','20091030_135711-out.wav',264684,'1','2009-10-30 13:57:31','Some user <01273123456>',20,'1256911031.5482','',None 

은 내가 csv_result을 반복해야 할 수도 있음을 볼 수 있지만 나는 내 인생하는 방법을 볼 수 없습니다 :이 모든 것의 요점은이 같은 CSV 파일 뭔가 끝낼 것입니다 그것은 각 데이터 유형마다 다르게 적용됩니다.

+0

그 유형은 일치? 내 말은, 테이블에있는 유형과 일치하는 행을 가져 와서 얻을 수있는 결과입니까? 어떤 라이브러리를 사용하여 DB에 연결하고 있습니까? – Cynical

+0

나는 문제가 무엇인지 알지 못한다. 'csv' 모듈 만 사용하면 원하는대로 할 수 있습니다. – Iguananaut

+0

또한 질문의 제목이 실제로 문제와 관련이있는 것 같지 않습니다. 파이썬은 당신이 선택한 쿼리에 대해 반복적으로 잘 동작하는 것처럼 보입니다.하지만 커서가'cursor.fetchone()'을 사용하고 있기 때문에 이중적이지 않습니다. – Iguananaut

답변

1

왜 그 값이 특이한가요? MySQLdb은 파이썬 유형으로 자동 변환 (intlong, DATEdatetime 등이됩니다.). 그냥 csv 튜플은 반환

import csv 
with open('file.csv', 'wb') as csvfile: 
    csv_ = csv.writer(csvfile) 
    csv_.writerow(csv_list) 

이것은 당신이 필요한 모든 작업을 수행합니다.
(따옴표 필요하면 quotechar="'", quoting = csv.CONSTANTHERE 키워드를 추가)

파일 내용 :

1,41,out,20091030_135711-out.wav,264684,1,2009-10-30 13:57:31,Some user <01273123456>,20,1256911031.5482,, 

(참고 :. None이를 사용하여 빈 문자열)

+0

이것은 완벽하게 들리며 의미가 있습니다. 내가 csvfile로 (csvfilename, 'WB')이 열린 에서, 라인 (176)'비록 데이터 유형 오류를 받고 있어요 : 형식 오류 : 유니 코드로 강요 : 필요 문자열 또는 버퍼, 파일을 – btongeorge

+0

found' 파이썬의 버전을하다 사용 하시겠습니까? – Amelia

+0

Python 2.7.3을 실행 중임 – btongeorge

2

원시 문자열을 반환합니다 모든 것을 제공하는 기본 형식 변환 사전을 대체 할 당신은 자동으로 사실 후 다시 문자열로 변환을 수행 할 csv 모듈을 사용할 수 있습니다, 또는 사용자 정의 conv 값으로 Connection 객체를 초기화 할 수 MySQL에서. 코드의 다른 지점에서 자동 유형 변환을 원할 경우 모든 변환을 수동으로 수행해야하거나 동일한 DB에 두 번째 자동 변환 연결이 있어야한다는 것을 알게됩니다.

+0

CSV 파일을 읽었지만 CSV 파일에 기록 된 형식을 변경하는 방법을 아직 보지 못했습니다. 다음 코드를 사용하여 파일을 쓸 수 있지만 값은 여전히 ​​잘못 입력됩니다 (int는 1L, 날짜는 datetime (dd, mm, ...)입니다.csv_list의 행에 대해 wr = csv.writer (csvfile, dialect = 'excel') : wr.writerow (행)에 대해 'csvfile = open (tar_path + "/"+ 클라이언트 _ ' – btongeorge

+0

'print csv_list'는 그 안에있는 데이터에 대해'__str__'을 출력합니다.'Connection'을 변경하여 원시 데이터로 작업하지 않는 한 항상 출력을 얻을 수 있습니다. 파일의 출력 형식도 잘못 지정 되었습니까? –

+0

예 - 파일의 출력이'print csv_list'와 동일하게 보입니다. 그것은 내가 목록에 들어가기 전에 ** 데이터에 대한 일종의 형식 변환을해야 할 것 같지만 어떻게 될까요? – btongeorge

관련 문제