Python 在xcel到制表符分隔文件转换期间将浮点转换为整数

Python 在xcel到制表符分隔文件转换期间将浮点转换为整数,python,casting,xlrd,Python,Casting,Xlrd,我编写了以下方法,将.xlsx文件转换为.txt制表符分隔的文件 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] s

我编写了以下方法,将
.xlsx
文件转换为
.txt
制表符分隔的文件

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()
此方法成功地在文件格式之间转换,但是,原始excel文件中显示为整数的内容在
.txt
文件输出中以浮点形式输出

我知道这可能与excel中的单元格格式设置有关。也就是说,我想在这个脚本中处理这个问题,因为我想用
int()
将文件中的元素显式定义为一个整数,而不是检查和修改所有excel文件,这将是一件乏味的事情

此方法逐行处理文件。是否有方法检索每行中的单个元素,以便将它们转换为整数

解决这一问题的方法有:

但演示了如何一次只为一个值执行此操作,而不是为整列值执行此操作

更清楚一点,我尝试将单个列转换为整数,但不是全部。因此,只需要转换每行的一些元素


数字列是第1、3和5列,在将行中的元素写入新文件之前,请使用列表理解将其转换为
int

for row in range(sh.nrows):
    new_row = [int(x) for x in sh.row_values(row)]
    writetab.writerow(new_row)
编辑:下面是OP的新评论,你需要做的是(尽管并不漂亮):

我建议你改变一下你的名字。在最外层的循环中,您对整数进行迭代,但将变量命名为
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)

你可以这样做:

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)
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, '!']

也可以考虑这一点来检查单元格是否为浮点/整型/文本,并使用一个自定义函数使用<强> map MAP/START>转换它,例如:

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)
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\u int\u或\u string
函数,并将此行更改为:

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

是否每个单元格都是一个
float
,应该是
int
,或者还有其他数据类型?每个单元格都是一个数值。浮点数或整数,尽管它们在excel中显示为整数。我早就应该更清楚了。某些列的每个单元格都是数字的。但是每一行都由数字列和字符串列组成。我只关心数字列,在本例中是第1、3和5列。是的,这就是我想要进入的方向。IMHO,类型检查——即使使用
try/except
——也不是Pythonic。在这种情况下,我怀疑它可能也很容易出错。@martineau,fair point,但我认为try/except将是处理拐角情况的更直接的方法,在这种情况下,使用其他普通字符串方法是非常困难的。