相关问题: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?
答案 0 :(得分:1)
我认为问题在于,当您使用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
。
如果按行 -
如果单元格是纯数字,此代码是否可以自动将单元格属性设置为数字的方式将txt转换为xlsx?
你的意思是你想把它设置为只有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()
。
答案 1 :(得分:0)
有两件事可能导致您的问题:
您可以/应该将您的值从CSV转换为{
"_id" : "Project1",
"data" : [
{
"suite-pass" : 2,
"suite-fail" : 1,
"date" : ISODate("2015-08-19T08:40:47.049Z")
},
{
"suite-pass" : 1,
"suite-fail" : 2,
"date" : ISODate("2015-08-19T08:50:47.049Z")
}
]
}
或int
,如下所示:
float
您对ws.cell(row=row_index, column=col_index).value = int(value) # or float(value)
的限制;你应该确保你确实有标签作为分隔符,或者你的CSV确实没有被引用。