【发布时间】:2021-05-15 20:37:34
【问题描述】:
我必须将由第三方生成的 csv 文件读取到 XLSX 文件中,该文件包含字符串、整数和价格(有时带有 $ 符号)的混合。这是存储在 csv 文件 a_test_f.csv 中的示例数据:
ColA,ColB
1,$11.00
2,22
3,"$1,000.56"
4,44
这是我编写的代码。我的问题是,这是执行此转换的最有效方式吗?是否有替代方法可以使用更少的处理能力/内存?这一点尤其重要,因为真正的 csv 文件将包含数千条记录和数百列,并且每天必须执行数万次转换操作。
import csv
import openpyxl
#
# Convert the data in csv file format that contains a mix of
# strings, integers and dollar amounts into xlsx file format
#
csvfile = 'a_test_f.csv'
xlsxfile = 'new_xlsx_f.xlsx'
wb = openpyxl.Workbook()
ws = wb.active
# remove $ and , from numbers
class Clean:
def __init__(self, data=''):
self.__obj = data
def __repr__(self):
return f"{self.__obj}"
def getData(self):
return self.__obj
def dollar(self):
try:
return Clean(data=self.__obj.replace('$',''))
except TypeError as err:
print(err)
def comma(self):
try:
return Clean(data=self.__obj.replace(',',''))
except TypeError as err:
print(err)
def digit(self):
try:
float(self.__obj)
return True
except ValueError:
return False
with open(csvfile) as f:
reader = csv.reader(f, delimiter=',', quotechar='"')
row_count=1
for row in reader:
for i in range(len(row)):
if Clean(data=row[i]).dollar().comma().digit():
content = float(repr(Clean(data=row[i]).dollar().comma()))
else:
content = row[i]
ws.cell(row=row_count,column=i+1).value = content
row_count +=1
wb.save(xlsxfile)
print('Finished!')
【问题讨论】:
-
创建对象只是为了运行替换会非常慢。您最好在一个简单的循环中执行此操作。
-
查理,非常感谢您的反馈。我会尝试使用函数并比较时间。
标签: python csv openpyxl xlsx file-conversion