0

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

有什么想法吗?

4

2 回答 2

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'])

如果您希望 i[MODEL_NUMBER] 来自列表。定义一个包含所有列名的列表。假设,l = ['MODEL_NUMBER','PRODUCT_NAME','TOTAL_ONHAND','TOTAL_ON_ORDER']。然后我在上面代码中的打印语句将是,

print ('%-20s %-90s OnHand: %-10s OnOrder: %-10s') % (i[l[0]],i[l[1]],i[l[2]],i[l[3]])

代码未检查.. :)

于 2012-11-22T11:18:08.890 回答
0

为了使您的代码更具可读性和更易于重用,您应该动态读取列的名称。CSV 文件通常在文件顶部有一个包含此信息的标题,因此您可以读取第一行并将其存储在元组或列表中。

于 2012-11-22T11:09:43.527 回答