2017-08-21 12 views
0

Djangoフォームを使用してCSVファイルを正常にアップロードしてアクセスし、ファイル内の行をループすることができます。ただし、最初の行には列ヘッダーが含まれており、コードがファイルの読み込みを開始すると、これらは何らかの理由でスキップされます。 forループ内のファイルへの最初の呼び出しは、ファイルの2行を返すために引き起こす何io.TextIOWrapperを使用してメモリ内のCSVファイルから最初の行を読み取る

from io import TextIOWrapper 

if request.method == 'POST': 

    form = UploadFileForm(request.POST, request.FILES) 

    if form.is_valid(): 

     csvfile = TextIOWrapper(request.FILES['file'], encoding="utf-8") 

     logger.info('Position: {}'.format(csvfile.tell())) # <-- This returns 0 

     for line in csvfile: 

      logger.info('line: {}'.format(line)) # <-- The first iteration actually logs the second line in the CSV file. 

答えて

0

アップロードされたCSVファイルに問題が発生しました。テスト用のCSVファイルを開き、データをスクラブして新しい名前で再保存した後、スクラブされたCSVファイルから列ヘッダー行を読み取ることができました。

元のソースCSVは、Excelからの電子メールによるCSVエクスポートでした。 LibreOffice CalcでCSVを開き、CSVファイルとして再保存すると、いくつかの隠し文字が削除されます。

0

あなたのコードはファイルに見えますが、なぜ動作しないのか分かりません。サンプルのCSVファイルを投稿することもできますし、PythonのCSVリーダーで試すこともできます。これはioよりも優れたライブラリです。以下の例を参照してください。

ファイルが次のようになっていると仮定します。

>>> import csv 
>>> f = open('myclone.csv', 'rb') 
>>> reader = csv.reader(f) 
>>> headers = reader.next() 
>>> headers 
['workers', 'constant', 'age'] 
>>> column = {} 
>>> for h in headers: 
... column[h] = [] 
... 
>>> column 
{'workers': [], 'constant': [], 'age': []} 
>>> for row in reader: 
... for h, v in zip(headers, row): 
...  column[h].append(v) 
... 
>>> column 
{'workers': ['w0', 'w1', 'w2', 'w3'], 'constant': ['7.334', '5.235', '3.2225', '0'], 'age': ['-1.406', '-4.936', '-1.478', '0']} 
>>> column['workers'] 
['w0', 'w1', 'w2', 'w3'] 
>>> column['constant'] 
['7.334', '5.235', '3.2225', '0'] 
>>> column['age'] 
['-1.406', '-4.936', '-1.478', '0'] 
>>> 

あなたは.next()関数でのヘッダを取得することができ、その後、あなたは後続の行の値を取得するために、行を反復処理することができます。

workers,constant,age 
w0,7.334,-1.406 
w1,5.235,-4.936 
w2,3.2225,-1.478 
w3,0,0 

このコードでは、あなたのアイデアや2を与える必要があります。

+0

ありがとう、@ shwetabh-sharan。その答えは、追加情報の要求に終わった。テスト用のCSVファイルを開き、データをスクラブして新しい名前で再保存した後、スクラブされたCSVファイルから列ヘッダー行を読み取ることができました。 – 5280Angel

関連する問題