我正在从我公司数据库的导出中解析CSV。这是一个精简版本有大约15列,实际的CSV有超过400列的数据(所有必要的)。以下工作完美:
inv = csv.reader(open('inventory_report.txt', 'rU'), dialect='excel', delimiter="\t")
for PART_CODE,MODEL_NUMBER,PRODUCT_NAME,COLOR,TOTAL_ONHAND,TOTAL_ON_ORDER,TOTAL_SALES,\
SALES_YEAR_TO_DATE,SALES_LASTYEAR_TO_DATE,TOTAL_NUMBER_OF_QTYsSOLD,TOTAL_PURCHASES,\
PURCHASES_YEAR_TO_DATE,PURCHASES_LASTYEAR_TO_DATE,TOTAL_NUMBER_OF_QTYpurchased,\
DATE_LAST_SOLD,DATE_FIRST_SOLD in inv:
print ('%-20s %-90s OnHand: %-10s OnOrder: %-10s') % (MODEL_NUMBER,PRODUCT_NAME,\
TOTAL_ONHAND,TOTAL_ON_ORDER)
正如您已经知道的那样,当'for'循环为CSV中的每一行项目附加了400多个名称时,读取将会非常痛苦。然而令人讨厌的是,通过这种方法能够访问我之后的输出非常方便。我可以轻松获取特定项目,并在我们已经熟悉的销售点数据库中使用的常用名称中进行计算。
我一直试图让它更具可读性。试图找出一种方法,我可以在for循环中定义所有这些名称的列表,但仍然可以在进行计算和打印输出时按名称调用它们。
有什么想法吗?
答案 0 :(得分:0)
为了使代码更易读,更容易重用,您应该动态地读取列的名称。 CSV文件用于在文件顶部包含包含此信息的标头,因此您可以读取第一行并将其存储在元组或列表中。
答案 1 :(得分:0)
你可以使用csv.DictReader。元素被读作dict。假设你有第一行作为列名。
inv = csv.DictReader(open('file.csv')):
for i in inv:
print ('%-20s %-90s OnHand: %-10s OnOrder: %-10s') % (i['MODEL_NUMBER'],i['PRODUCT_NAME'],i['TOTAL_ONHAND'],i['TOTAL_ON_ORDER'])
如果你想让我[MODEL_NUMBER]来自清单。定义包含所有列名称的列表。假设l = ['MODEL_NUMBER','PRODUCT_NAME','TOTAL_ONHAND','TOTAL_ON_ORDER']
。然后我在上面的代码中的print语句将是,
print ('%-20s %-90s OnHand: %-10s OnOrder: %-10s') % (i[l[0]],i[l[1]],i[l[2]],i[l[3]])
未检查代码.. :))