2012-11-12 2 views
3

최근에 저는 파이썬 프로젝트를 상속 받았으며, 저는 제가 고심하고있는 행동을했습니다.파이썬 MySQL UTF-8 인코딩은 실행 순서에 따라 다릅니다.

코드에는 두 개의 섹션이 있으며 파일을 데이터베이스로 가져올 수도 있고 데이터베이스를 출력 파일로 덤프 할 수도 있습니다. 가져 오기는 다음과 같은 :

def importStuff(self): 
    mysqlimport_args = ['mysqlimport', '--host='+self.host, '--user='+self.username, '--password='+self.password, '--fields-terminated-by=|', '--lines-terminated-by=\n', '--replace', '--local', self.database, filename, '-v'] 
    output = check_output(mysqlimport_args) 

덤프는 다음과 같습니다

def getStuff(self): 
    db = MySQLdb.connect(self.host, self.username, self.password, self.database) 
    cursor = db.cursor() 
    sql = 'SELECT somestuff' 
    cursor.execute(sql) 
    records = cursor.fetchall() 
    cursor.close() 
    db.close() 
    return records 

def toCsv(self, records, csvfile): 
    f = open(csvfile, 'wb') 
    writer = csv.writer(f, quoting=csv.QUOTE_ALL) 
    writer.writerow(['StuffId']) 
    count = 1 
    for record in records: 
     writer.writerow([record[0]]) 

    f.close() 

좋아하지 (내가 더 배우고 싶지만 스타일의 의견 환영) 당신이 이제까지 볼 가장 예쁜 파이썬 그러나 그것은 합리적으로 보인다.

그러나 소비자로부터 내 출력이 UTF-8이 아님 (MySQL 테이블은 utf8 인코딩을 사용하고 있습니다) 불만이 있습니다. 나는이 지워지 경우 프로그램이 다음과 같이 실행하면 여기입니다 :

importStuff(...) 

getStuff(...) 

toCsv(...) 

그런 다음 출력 파일이 유효한 UTF-8로 표시되지 않습니다. 내가 다른 파일에 두 개의 서로 다른 단계 다음
importStuff(...) 

으로 실행을 중단하면

getStuff(...) 

toCsv(...) 

갑자기 내 출력은 유효한 UTF-8이 나타납니다. 나는 주변에서 일하는 것을 제외하고는, 나는이 행동을 설명하는 것처럼 보이지 않는다. 누구든지 내가 여기서 잘못하고있는 것에 대해 밝힐 수 있습니까? 또는 진행 상황을 명확히 할 수있는 정보를 더 제공 할 수 있습니까?

감사합니다. 요청에 따라 추가 코드 :

편집 (요인 경우 파이썬 2.7)

. 내 회사로 무고한 등을 보호하기 위해 몇 가지 사소한 조작을했습니다,하지만 여기에 더 많거나 적은있어 :

def main(): 

    dbutil = DbUtil(config.DB_HOST, config.DB_DATABASE, config.DB_USERNAME, config.DB_PASSWORD) 
    if(args.import): 
     logger.info('Option: --import') 

     try: 
      dbutil.mysqlimport(AcConfig.DB_FUND_TABLE) 
     except Exception, e: 
      logger.warn("Error occured at mysqlimport. Error is %s" % (e.message)) 

    if(args.db2csv): 
     try: 
      logger.info('Option: --db2csv') 
      records = dbutil.getStuff() 
      fileutil.toCsv(records, csvfile) 
     except Exception, e: 
      logger.warn("Error Occured at db2csv. Message:%s" %(e.message)) 

main() 

그리고 그것에 대해입니다. 이것은 매우 짧아서이 점을 훨씬 덜 명백하게합니다.

는 는

나는 충실하게 표현하는 방법을 잘 모르겠어요 출력은 보인다 :

"F0NR006F8F" 

그들은 모두 나에게 더 많거나 적은 ASCII 문자 모양을, 그래서 나는 어떤 문제가 확실하지 않다 그들이 만들 수 있습니다. 어쩌면 나는 잘못된 각도에서 접근하고 있습니다. 현재 파일 인코딩이 무엇인지에 대한 텍스트 편집기의 최선의 추측에 의존하고 있습니다. 어떤 문자가 내 파일 읽기를 멈추게하는지 가장 잘 감지 할 수있는 방법을 모르겠습니다. UTF-8로

+1

두 개의 다른 코드 결과와 두 개의 서로 다른 결과를 생성 할 수 있습니까? – BrenBarn

+1

다른 주름이 있다고 생각합니다. 차이점은 인코딩이 변경되지 않아야한다는 것입니다. –

+0

가능한 복제본 : [Python으로 MySQL에 UTF-8 문자열 작성하기] (http://stackoverflow.com/questions/6202726/writing-utf-8-string-to-mysql-with-python). mysqldb.connect' 호출에서 MySQLdb.connect (use_unicode = True, charset = 'utf8')'인수가 필요하다고 생각합니다 ('use_unicode = True'는 반드시 필요하지 않으며'charset = 'utf8' '). –

답변

0

항상 멍청한 답변입니다. 입력 데이터가 UTF-8이 아니 었습니다. 누군가 utf-8이 아닌 utf-8 문자를 주기적으로 호출하는 sproc을 작성하여이를 해결했습니다. 내 코드를 두 개의 파일로 분리하여 따로 실행하는 데 걸리는 시간에 작업이 실행되었습니다. 그런 일이 발생하여 4-5 번 시도해 보았습니다. 잘못된 결론을 내릴 수있었습니다. 지금은 non-utf-8 입력 소스를 수용 할 수 있도록 읽기 프로세스를 변경하고 있으므로 시스템에 이상한 경쟁 상태가 나타나지 않습니다. 이 구스 체이스에서 모두 너를 이끌어 주어서 미안해.

관련 문제