Python,在解析CSV时为for循环创建一个列表

时间:2012-11-22 11:00:26

标签: python csv

我正在从我公司数据库的导出中解析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循环中定义所有这些名称的列表,但仍然可以在进行计算和打印输出时按名称调用它们。

有什么想法吗?

2 个答案:

答案 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]])

未检查代码.. :))