1

シンプルな CSV ファイルを GAE アプリにインポートしていて、リストの最初の項目を選択したいと考えています。以下のコードは CSV ファイルをインポートし、各行をリストとして保存します。各リスト項目の最初のエントリのみを表示したいのですが、data[1] を使用すると範囲外と表示されます。明らかな何かが欠けていると思いますが、それを理解できないようです。どんな助けでも大歓迎です!

class CSVImport(webapp2.RequestHandler):
def post(self):
  csv_file = self.request.get('csv_import')
  fileReader = csv.reader(csv_file.split("\n"))
  dataset = []
  dataset.extend(fileReader)
  for data in dataset:
    self.response.out.write(data)

編集1

参考までに、最初のコードは次の応答を返しました: ['name'、'description'、'url'、'category'、'deliverycost'、'returning'、'provider'、'prov_id'、'logo'、'last_update ']['Amazon', 'desc を変更しました', 'http://www.url.com', 'Meta', '5 Euro', 'Gratis', 'Affilinet', 'Test', '/images/ logos/amazon.jpg', '2012-12-26 13:11:22.519000']['B ショップ', '', 'http://www.url.com', '', '', '', '', '', '', '2012-12-26 13:19:01.545000']['Otto', '何かをテストする', 'http://amazon.de', 'メタ', '', ' sdgs', 'sdgsdg', 'sdgds', 'dsgdsg', '2012-12-26 13:09:10.716000'][]

RocketDonkey の回答に基づいて、コードを次のように書き直しました。

class CSVImport(webapp2.RequestHandler):
def post(self):
   csv_file = self.request.get('csv_import')
   with open(csv_file, 'rb') as f:
      fileReader = csv.reader(f)
      for data in fileReader:
        print data[0]

ただし、これにより次のエラーが発生します: IOError: [Errno 13] ファイルにアクセスできません: 'name,description,url,category,deliverycost,returning,provider,prov_id,logo,last_update\r\nAmazon,Changed the desc,http:// www.url.com、メタ、5 ユーロ、無料、アフィリネット、テスト、/images/logos/amazon.jpg、2012-12-26 13:11:22.519000\r\nB ショップ、http://www.url .com,,,,,,,2012-12-26 13:19:01.545000\r\nOtto,何かをテストしてください,http://amazon.de,Meta,,sdgs,sdgsdg,sdgds,dsgdsg,2012-12- 26 13:09:10.716000\r\n'

「 accessible: 」の後のコンテンツは、CSV ファイルの正確なコンテンツです。これが、「ファイルにアクセスできません」というエラーが注目に値する理由です。CSV ファイルは、次のような HTML フォームから取得されます。

<form action="/admin/shop/import" method="post" enctype="multipart/form-data">
   <p><strong>Import:</strong>
   <input type="file" name="csv_import" id="csv_import" accept=".csv">
   <input type="submit" value="Import"></p>
</form>

RemoteAPI がおそらくこれに対するより良い解決策であることは承知していますが、Windows 7 でこれを設定するのに問題があるため、今のところ回避策としてこれを構築しようとしています。したがって、CSV ファイルの 1 つの列からデータを選択できるようになったら、定義したデータベース モデルと照合します。

4

2 に答える 2

0

Pythonでは、配列は0 ... n-1から始まります。したがって、各リストアイテムの最初のエントリのみを表示しようとしている場合は、必ずarray [0]を使用する必要があり、data[1]であってはなりません。 。

于 2012-12-27T15:12:56.337 に答える
0

編集:更新された応答によると、実際のファイルの内容を で取得しているように見えcsv_file、改行区切り文字は\r\nです。したがって、次のことを試すことをお勧めします。

In [1]: import csv

In [2]: csv_file = # Copied the response from your error into this variable

In [3]: reader = csv.reader(csv_file.split('\r\n'))

In [4]: for row in reader:
   ...:     if row:
   ...:         print row[0]
   ...:         
   ...:         
name
Amazon
B Shop
Otto

if rowCSV 文字列の末尾が であることがわかるため、チェックが行われます。これは、文字で\r\n分割する\r\nと、リストの最後の項目が空になることを意味します。その空の要素が によって読み取られる csv.readerと、結果は空のリストになります。これは、ご存知のようIndexErrorに、インデックスによる何らかのアクセスを試みた場合に失敗します。または、事前にこれを行って、すべての「行」に値が含まれるようにすることもできます。

In [8]: csv_file = [row for row in csv_file.split('\r\n') if row]

In [9]: reader = csv.reader(csv_file)

In [10]: for row in reader:
   ....:     print row[0]
   ....:     
   ....:     
name
Amazon
B Shop
Otto

あなたのユースケースはよくわかりませんが、コードを使用してアプリにデータをアップロードしている場合は、Remote APIを確認することをお勧めします。これは、それを実行するための非常にクリーンな方法を提供し、特別なハンドラーを使用する必要があるなど。

実際の CSV (ファイルの文字列名ではなく、ファイル名を渡す場合は以下を参照) を渡すと仮定するので、次のようになります。

some_csv = 'header1,header2\nvalue1,value2'

あなたがしているのは、改行で分割し、csv.reader反復するオブジェクトを渡すことです。その結果はcsv.readerオブジェクトです。datasetこのオブジェクトを直接反復処理できるため、別の変数を作成する必要がないことに注意してください。

In [1]: import csv

In [2]: some_csv = 'header1,header2\nvalue1,value2'

In [3]: fileReader = csv.reader(some_csv.split("\n"))

In [4]: fileReader
Out[4]: <_csv.reader object at 0x1306440>

In [5]: for data in fileReader:
   ...:     print data
   ...:     
   ...:     
['header1', 'header2']
['value1', 'value2']

を使用print data[1]すると、各リストの 2 番目の項目が出力されます (@sadaf2605 で言及されているように、Python はゼロベースのインデックスを使用するため、最初の要素は実際には になりますdata[0])。エラーは、行ごとに要素が 1 つしかないことを示しているため、最初に確認することは、実際にコンマ区切りの値をそのパラメーターに渡しているかどうかです。

ただし、CSVファイルをインポートしていることにも言及しています.URLパラメータはファイル名自体への文字列参照ですか? その場合、実際にファイルを開くわけではないため、問題が発生します。データではなく、ファイル自体の名前のみを含むオブジェクトを反復処理することになります。

In [1]: import csv

In [2]: some_csv = 'some_csv.csv'

In [3]: fileReader = csv.reader(some_csv.split("\n"))

In [4]: for data in fileReader:
   ...:     print data
   ...:     
   ...:     
['some_csv.csv']

ゼロベースのインデックス付けでも、この配列には 2 番目の要素がないことがわかります。したがって、IndexError. これがあなたのケースである場合は、これを試すことができます(ただし、Remote APIを再度お勧めします:))

In [1]: import csv

In [2]: some_csv = 'some_csv.csv'

In [3]: with open(some_csv, 'rb') as f:
   ...:     fileReader = csv.reader(f)
   ...:     for data in fileReader:
   ...:         print data[0]
   ...:         
   ...:         
header1
value1
于 2012-12-27T15:47:52.370 に答える