2015-01-07 2 views
0

.xlsx 파일을 .txt 탭으로 구분 된 파일로 변환하는 다음 방법을 작성했습니다.xcel에서 탭으로 정수로 변환 정수형 파일 변환

import sys 
import xlrd 
import csv 

def xlsx_to_tab(self, inFile): 
    ''' Convert an xlsx file to a tab delimited file. ''' 
    excel_file = xlrd.open_workbook(inFile) 
    worksheet = excel_file.sheet_names()[0] 
    sh = excel_file.sheet_by_name(worksheet) 
    extentPos = inFile.rfind('.') 
    tab_file = open(inFile[:extentPos] + '.txt', 'w') 
    writetab = csv.writer(tab_file, delimiter='\t', quoting=csv.QUOTE_ALL) 

    for row in range(sh.nrows): 
     writetab.writerow(sh.row_values(row)) 

    tab_file.close() 

이 방법은 성공적으로하지만, 무슨 일이 원래의 엑셀 파일에서 정수 할 것을 .txt 파일 출력에 수레로 출력하는 표시, 파일 형식 사이의 변환합니다.

Excel의 셀 형식 설정과 관련이 있다고 생각합니다. 즉, 나는이 스크립트 내에서 이것을 처리하고 싶습니다. 파일 내의 요소를 int()이라는 정수로 명시 적으로 정의하고 싶습니다. 전에 지루한 모든 Excel 파일을 검사하고 변경하는 것과는 대조적입니다.

이 메서드는 파일을 한 행씩 처리합니다. 각 행의 개별 요소를 검색하여 형식으로 입력 할 수 있나요? 주소

This question 종류의 문제는 :

는하지만 값의 전체 열 반대로 한 번에 하나 개의 값을 수행하는 방법을 보여줍니다.

좀 더 명확히하기 위해 개별 열을 정수로 캐스팅하려고하지만 모든 열을 캐스팅하지는 않습니다. 따라서 각 행의 일부 요소 만 변환해야합니다.

for row in range(sh.nrows): 
    new_row = [int(x) for x in sh.row_values(row)] 
    writetab.writerow(new_row) 

편집 : : OP의와

숫자 열은 열 1,3, 새 파일에 쓰기 전에 int에 행의 요소를 변환하는 5

+0

모든 셀이 'int'이어야하는 'float'입니까? 아니면 다른 데이터 유형도 있습니까? – dursk

+0

각 셀은 숫자 값입니다. float 또는 int 중 하나로서 int에 표시됩니다. – Malonge

답변

1

사용 지능형리스트입니다

int_columns = [1, 3, 5] 
for row in range(sh.nrows): 
    new_row = sh.row_values(row) 
    for col in int_columns: 
     new_row[col] = int(new_row[col]) 
    writetab.writerow(new_row) 

그리고 난 당신이 조금 이름 변경 제안 : 당신이 (꽤 아니다하지만) 무엇을해야하는지 아래 새로운 코멘트입니다. 가장 바깥 쪽 루프에서는 정수를 반복하지만 변수의 이름은 row입니다. 나는 그것을 좋아 써서 :

int_columns = [1, 3, 5] 
for i in range(sh.nrows): 
    row = sh.row_values(i) 
    for col in int_columns: 
     row[col] = int(new_row[col]) 
    writetab.writerow(row) 
+0

나는 더 일찍 분명 했어야했다. 특정 열의 각 셀은 모두 숫자입니다. 그러나 각 행은 숫자 열과 문자열 열로 구성됩니다.이 경우 숫자 열 1,3 및 5 만 관련됩니다. – Malonge

+0

예, 들어갈 방향입니다. – Malonge

1

당신은 이런 식으로 그것을 할 수 :

for row in range(sh.nrows): 
    new_row = [int(x) if i in {1,3,5} else x for i, x in 
     enumerate(sh.row_values(row), start=1)] 
    writetab.writerow(new_row) 
0

또한 셀이 부동/정수/텍스트가 있는지 확인하고 지도를 사용하여 변환하려면이 옵션을 고려할 수 있습니다 이 같은 사용자 정의 함수와 :

def convert_int_or_string(n): 
    try: 
     float(n) 
     assert str(n).lower() != 'nan' 
     return int(float(n)) 
    except (ValueError, AssertionError): 
     return n 

test_row 
['3.14', 
'nan', 
'12.143141234', 
'hello', 
'0.13989402028', 
'world', 
'0.26575558139', 
'11', 
'0.919189932407', 
'!'] 

map(convert_int_or_string, test_row) 
[3, 'nan', 12, 'hello', 0, 'world', 0, 11, 0, '!'] 

는 모듈이 convert_int_or_string 기능을 추가하고이 줄을 변경 :

writetab.writerow(map(convert_int_or_string, sh.row_values(row))) 
+0

IMHO, 유형 검사 - 'try/except'를 사용하는 경우에도 Pythonic이 아닙니다. 이 경우에는 오류가 발생하기 쉽습니다. – martineau

+0

@martineau, 공정한 포인트,하지만 난 try/except가 다른 일반적인 문자열 메소드를 사용하는 경우를 처리하는 더 직접적인 방법이라고 생각합니다. – Anzel