相关问题:Error in converting txt to xlsx using python
我修改了以下代码,谢谢Anand S Kumar.
import csv
import openpyxl
import sys
def convert(input_path, output_path):
"""
Read a csv file (with no quoting), and save its contents in an excel file.
"""
wb = openpyxl.Workbook()
ws = wb.worksheets[0]
with open(input_path) as f:
reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
for row_index, row in enumerate(reader, 1):
for col_index, value in enumerate(row, 1):
ws.cell(row=row_index, column=col_index).value = value
wb.save(output_path)
def main():
try:
input_path, output_path = sys.argv[1:]
except ValueError:
print 'Usage: python %s input_path output_path' % (sys.argv[0],)
else:
convert(input_path, output_path)
if __name__ == '__main__':
main()
这样做的问题是,这将xlsx保存为将纯数字单元格保存为普通文本的方式.
因此,当我不得不使用MS-Excel手动打开xlsx文件,然后单击“转换为数字”时.
如果单元格是纯数字的,此代码是否可以通过将单元格属性自动设置为数字的方式将txt转换为xlsx?
解决方法:
我认为问题在于,当您使用csv模块读取数据时,您正在读取所有字符串.范例-
a.csv看起来像-
1,2,3
3,4,5
4,5,6
代码和结果-
>>> import csv
>>> with open('a.csv','r') as f:
... reader = csv.reader(f)
... for row in reader:
... print(row)
...
['1', '2', '3']
['3', '4', '5']
['4', '5', '6']
并且在您的特定代码中,您直接将csv模块返回的值设置为openpyxl,因此您将获取字符串而不是数字.
最好的解决方案是,如果您知道期望数据作为整数的列,则可以在将其设置为excel之前检查一下代码以将这些数据转换为整数.范例-
int_cols = set([2,4,5]) #This should be the list of all columns , 1 indexed, that contain integers.
with open(input_path) as f:
reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
for row_index, row in enumerate(reader, 1):
for col_index, value in enumerate(row, 1):
if col_index in int_cols:
ws.cell(row=row_index, column=col_index).value = int(value)
else:
ws.cell(row=row_index, column=col_index).value = value
如果有浮点数,则可以为它们使用类似的逻辑,定义一组浮点数列,然后,如果col_index是该列,则在保存之前将值转换为浮点数.
如果按行-
Can this code convert txt to xlsx in a way that automatically sets the cell property as number, if the cell is purely number?
您的意思是要为所有只包含数字(甚至不是小数)的单元格将其设置为number,然后可以使用以下方法-
def int_or_str(x):
try:
return int(x)
except ValueError:
return x
然后,您可以在代码中将设置值的行更改为-
ws.cell(row=row_index, column=col_index).value = int_or_str(value)
如果要转换浮点数,请在上述方法中使用float().