2017-08-25 3 views
1

URLリクエストの結果をPythonでCSV reader objectに変換しようとしています。出力は罰金だが、次のエラーが発生します。Python:csvリーダーへのURLデータ

for study_id, sample_id, run_id in reader: 
ValueError: not enough values to unpack (expected 3, got 1) 

最初に私がデータを要求し、文字列データに変換します

req = urllib.request.Request(url=url_get_project_runs, headers={'Content-Type': 'text/plain'}) 
     res = urllib.request.urlopen(req) 
     dec_res = res.read().decode() 
     sys.stderr.write(str(dec_res)) --> for the print see below 
     return dec_res 

印刷この与える:

ERP001736,ERS494374,ERR598958 
ERP001736,ERS494394,ERR598963 
ERP001736,ERS494431,ERR598964 
ERP001736,ERS494445,ERR599170 
ERP001736,ERS494488,ERR598996 
ERP001736,ERS494518,ERR598976 
ERP001736,ERS494559,ERR598986 
ERP001736,ERS494579,ERR599078 
ERP001736,ERS494616,ERR598944 
ERP001736,ERS494628,ERR599001 
ERP001736,ERS488919,ERR1701760 

これをアイテムはコンマで区切られており、「行」は元のままなので、私にとってはうまくいくようです。 しかし、私はCSVリーダーのための入力としてこれを使用し、ここで、3つの列を印刷しようとした場合:

reader = csv.reader(dec_res, delimiter=',') 
     for study_id, sample_id, run_id in reader: 
      print(study_id + ", " + sample_id + ", " + run_id) 

次のエラーが発生します。 ValueError: not enough values to unpack (expected 3, got 1)

は、私はさらににいくつかのコードをテストしましたこれは与える

for row in reader: 
      sys.stderr.write(str(row)) 

問題を見つけます

答えて

3

strをcsvリーダーに渡していますが、これは1行ずつの繰り返しが可能です。 strは、文字単位で繰り返し可能です。文字列をStringIOで囲むか、splitlines(または、行単位の繰り返し可能な他の手段)を使用してください。

import csv 
from io import StringIO 

dec_res = """ERP001736,ERS494374,ERR598958 
ERP001736,ERS494394,ERR598963 
ERP001736,ERS494431,ERR598964 
ERP001736,ERS494445,ERR599170 
ERP001736,ERS494488,ERR598996 
ERP001736,ERS494518,ERR598976 
ERP001736,ERS494559,ERR598986 
ERP001736,ERS494579,ERR599078 
ERP001736,ERS494616,ERR598944 
ERP001736,ERS494628,ERR599001 
ERP001736,ERS488919,ERR1701760""" 

reader = csv.reader(StringIO(dec_res), delimiter=',') 
#reader = csv.reader(dec_res.splitlines(), delimiter=',') 

for study_id, sample_id, run_id in reader: 
    print(study_id + ", " + sample_id + ", " + run_id) 
+1

ありがとうございます! – CodeNoob

+0

実際にCSV(常にではない)あなたがリスト内にそれらを渡すと、通常の文字列を読み取ることができます: ' >>>データ= csv.reader([ 'ERP001736、ERS494374、ERR598958']) >>>リスト(データ) [['' ERP001736 '、' ERS494374 '、' ERR598958 ']] しかし、@ダマスティスの方がはるかに優れています。 –

関連する問題