将 txt 转换为 xlsx,同时将数字单元格的单元格 属性 设置为数字
Converting txt to xlsx while setting the cell property for number cells as number
相关问题:
我修改了以下代码,谢谢 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 文件,然后单击 "Convert to number"。
如果单元格是纯数字,此代码能否以自动将单元格 属性 设置为数字的方式将 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 是那个列,在保存之前将值转换为 float
.
如果按行 -
Can this code convert txt to xlsx in a way that automatically sets the cell property as number, if the cell is purely number?
你的意思是你想为所有只有 digits
(甚至不是小数)的单元格设置它为数字,那么你可以使用像下面这样的方法 -
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()
,如果你也想转换浮点数。
有两件事可能导致您的问题:
您 can/should 将您的值从 CSV 转换为 int
或 float
,如下所示:
ws.cell(row=row_index, column=col_index).value = int(value) # or float(value)
您的 csv.reader
;你应该确保你确实有制表符作为分隔符或者你的 CSV 确实没有被引用。
openpyxl 确实支持工作簿的 guess_types
参数,如果可能的话会将字符串转换为数字。在没有歧义的情况下使这种事情变得更容易。但是您通常最好自己管理转换。
相关问题:
我修改了以下代码,谢谢 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 文件,然后单击 "Convert to number"。
如果单元格是纯数字,此代码能否以自动将单元格 属性 设置为数字的方式将 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 是那个列,在保存之前将值转换为 float
.
如果按行 -
Can this code convert txt to xlsx in a way that automatically sets the cell property as number, if the cell is purely number?
你的意思是你想为所有只有 digits
(甚至不是小数)的单元格设置它为数字,那么你可以使用像下面这样的方法 -
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()
,如果你也想转换浮点数。
有两件事可能导致您的问题:
您 can/should 将您的值从 CSV 转换为
int
或float
,如下所示:ws.cell(row=row_index, column=col_index).value = int(value) # or float(value)
您的
csv.reader
;你应该确保你确实有制表符作为分隔符或者你的 CSV 确实没有被引用。
openpyxl 确实支持工作簿的 guess_types
参数,如果可能的话会将字符串转换为数字。在没有歧义的情况下使这种事情变得更容易。但是您通常最好自己管理转换。