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)

すでにお分かりのように、CSVの行の各項目に「for」ループに400以上の名前が付加されている場合、読むのは非常に困難です。どんなに面倒でも、この方法で私が求めている出力にアクセスできるのは非常に便利です。特定のアイテムを簡単に取得し、POSデータベースですでに使い慣れている一般名の範囲内で計算を実行できます。

私はこれをもっと読みやすくしようとしています。forループでこれらすべての名前のリストを定義できるが、計算を行って出力を出力するときに名前でそれらを呼び出すことができる方法を見つけようとしています。

何かご意見は?

4

2 に答える 2

0

コードを読みやすく、再利用しやすくするには、列の名前を動的に読み取る必要があります。CSVファイルは、ファイルの上にこの情報を含むヘッダーを持っていたため、最初の行を読み取ってタプルまたはリストに保存できます。

于 2012-11-22T11:09:43.527 に答える
0

csv.DictReaderを使用できます。要素はdictとして読み取られます。uの列名が最初の行であると仮定します。

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ステートメントは次のようになります。

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 に答える