BLOG ARTICLE iconv | 1 ARTICLE FOUND

  1. 2008.08.25 텍스트파일 문자셋 변환 스크립트 (6)

간혹 euc-kr로된 파일들을 utf-8로 변경할 경우가 있어 파이썬으로 아래와 같이 iconv를 이용하는 간단한 스크립트를 만들어 사용했습니다.

#!/usr/bin/python

import os, sys

for arg in sys.argv[1:]:
    if os.path.isfile(arg):
        os.rename(arg, arg + '.chg')
        command = 'iconv -f euc-kr  -t utf-8 ' + arg + '.chg' + ' > ' + arg
        os.system(command)

파이썬 인자관리의 편리한 기능으로 위와 같이 단순한 코드로도 '*.txt'나 '*'와 같은 와일드카드도 자동으로 처리되어 별다른 불편함 없었습니다.

그런데 이번에는 반대로 utf-8을 euc-kr로 변경할 경우가 생겨 스크립트를 변경하면서 옵션을 추가하여 보았습니다. 몇 번 사용해 보았는데 별 문제가 없어 올려 봅니다. (오류나 잘못된 부분이 있으면 알려주시면 감사하겠습니다. ^^;;) 기본 사용법은 아래와 같습니다.

사용자 삽입 이미지

1) 옵션
  • -h: 위와 같은 사용법을 출력합니다.
  • -r: 서브디렉토리의 파일들도 변환합니다.
  • -f: 디렉토리가 아닌 인자로 넘어 온 파일들을 변경합니다.
  • -x: 이전 파일의 백업파일을 남기지 않습니다.
  • -d: 작업 디렉토리를 지정합니다.
  • -s: 이전 파일을 백업할 파일 확장자를 지정합니다.
  • -e: 변경할 파일의 확장자를 지정합니다.
  • -o: 변경될 파일의 현재 문자셋을 지정합니다.
  • -n: 변경될 문자셋을 지정합니다.

-f는 파일 단위로 -d는 디렉토리 단위로 변환하며, 두 옵션을 같이 사용할 수 없습니다. 현재 파일의 문자셋은 euc-kr로 변경될 문자셋은 utf-8이 기본으로 설정되어 있습니다. -d 옵션에선 사고(?)를 방지하기 위해 변경될 파일의 확장자가 'txt'가 기본으로 설정되어 있으며, 이는 -e[확장자] 옵션으로 변경할 수 있습니다.

이전 파일은 [파일명].chg로 동일 디렉토리에 저장되며, 이 확장자는 -s[확장자] 옵션으로 변경할 수 있습니다. -x 옵션을 사용하면 이전 파일을 저장하지 않습니다.

2) 사용예
* 현재 디렉토리의 data.txt 파일 변경 (euc-kr -> utf-8)
$ chgchar -f data.txt

* 현재 디렉토리의 data.txt 파일 변경 (utf-8 -> euc-kr)
$ chgchar -outf-8 -neuc-kr -f data.txt

* 현재 디렉토리의 *.txt 파일 변경
$ chgchar -f *.txt

* test 디렉토리 내의 모든 txt 파일 확장자를 가진 모든 파일 변경
$ chgchar -d./test -etxt

* 현재 디렉토리 내의 모든 파일과 서브 디렉토리의 파일도 변경
$ chgchar -r -e* -d./

3) 주의사항
파일을 변경하는 위험한(?) 작업인데 테스트와 사용횟수가 부족하기 때문에, 아래의 사항에 유의하시면서 사용하셔야 합니다.
  • 백업파일을 저장하지 않는 '-x' 옵션 사용하지 않는 것이 좋습니다.
  • 와일드카드(*)는 가능한 사용하지 않는 것이 좋습니다.
  • 대상 디렉토리와 파일을 확인하고 실행해 주세요.

4) 다운로드
아래의 압축파일을 다운로드 받아서 압축을 푸시고 'chmod +x ./chgchar'로 파일의 실행권한을 추가하시고 사용하시면 됩니다.

* 2008.10.21 추가
"nakada님으로 부터 파일 접근권한을 설정하지 않은 문제가 있는 것을 알게되었습니다. 자세한 내용은 nakada님의 포스팅을 참조하시기 바랍니다. nakada님이 작업하신 내용은 이곳에서도 변경해 놓았습니다. nakada님께 감사 드립니다. ^^"



* 아래의 'more..'를 클릭하시면 스크립트의 내용을 확인하실 수 있습니다.

모든 댓글을 환영합니다. (욕설과 광고는 삭제합니다.)
  1. Favicon of http://seapy.com BlogIcon nakada 2008.10.06 14:36  댓글주소  수정/삭제  댓글쓰기

    필요한일이 있어서 찾고 있었는데 감사합니다 ^^
    그런데 os.system 의 리턴값이 0이면 변환이 성공적으로 된게 아닌가요?
    os.system 메뉴얼 보면 시스템 마다 다르다고 하던데 저는 리눅스 서버에서 하는데
    iconv 중에 오류가 발생하면 256이 리턴값이고 그렇지 않으면 0이 리턴값이네요
    제가 잘못 사용하는건지 모르겠지만 success 와 fail 을 print 하는게 뒤바뀐게 아닌가 싶어서요. 백업파일은 성공했을때도 지워주고, 실패했을때는 남겨두어야 맞는거 같아서요
    잘 사용했습니다 ^^

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2008.10.06 15:34 신고  댓글주소  수정/삭제

      저도 그렇게 알고 "if ret <> 0:" 반환값이 0이 아니면 fail을 출력하도록 했는데요. 잘 못된 부분이 있나요? 타성에 젖어서 그런지 눈에 잘 안들어 오네요. ^^;;

  2. Favicon of http://seapy.com BlogIcon nakada 2008.10.06 15:57  댓글주소  수정/삭제  댓글쓰기

    우와 댓글을 바로주시네요 ^^ 저는 블로그 댓글 엄청 늦게 확인하는데요
    저는 압축파일을 받았거든요 본문에 펼쳐지는 소스로는 제대로 되있는데요
    압축파일을 풀어서 확인해본 파일은 반대로 되있었네요 ^^

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2008.10.06 16:23 신고  댓글주소  수정/삭제

      앗, 그렇군요. 수정해서 다시 올렸습니다. 알려 주셔서 감사합니다. :)

      블로그 댓글을 모니터링 하는 툴이 있어 실시간으로 알 수 있는데, 업무시간엔 확인만 하고 대부분 답변을 뒤로 미룹니다. 오늘은 좀 한가하네요. ^^;;

  3. Favicon of http://seapy.com BlogIcon nakada 2008.10.21 10:55 신고  댓글주소  수정/삭제  댓글쓰기

    퍼미션 관련해서 제가 조금 수정해본걸 트랙백 걸었습니다 ^^
    앞으로 자주 사용할것 같아요~