の読み方、私は単純にCSVライターを使用してCSVで完全に構成さDjangoのHttpResponseオブジェクトを作成:ユニットテストではビューでCSVジャンゴHTTPレスポンス
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="foobar.csv"'
writer = csv.writer(response)
table_headers = ['Foo', 'Bar']
writer.writerow(table_headers)
bunch_of_rows = [['foo', 'bar'], ['foo2', 'bar2']]
for row in bunch_of_rows:
writer.writerow(row)
return response
を、私はいくつかの側面をテストしたいですこのCSVのうち、私はそれを読む必要があります。
response = views.myview(args)
reader = csv.reader(response.content)
headers = next(reader)
row_count = 1 + sum(1 for row in reader)
self.assertEqual(row_count, 3) # header + 1 row for each attempt
self.assertIn('Foo', headers)
をしかしテストはheaders = next(reader)
ラインで次のように失敗します:私はそこそこのようにやろうとしている
nose.proxy.Error: iterator should return strings, not int (did you open the file in text mode?)
私はresponse.content
は、文字列をバック吐き出していることはHttpResponseソースで見ます私はバイト文字列として、私は正しい方法を理解することができませんcsv.reader
ファイルを正しく読み取らせるには対処する。私は(あなたがオブジェクト自体に書き込みをするので、それはコンテンツだではない)だけresponse
でresponse.content
を置き換えることができるだろうと思ったが、それは単にエラーのわずかな変動が生じた:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
明らかに近いが、そうですまだ間違っています。 csv
ドキュメントを読むと、ファイルを正しく開くことができないと思います。 csv.reader
がそれを解析できるように、このファイルのようなオブジェクトを「開く」方法は?
どちらの回答も有効ですが、私の特定のケースでは、内容が非常に小さいので、knbkの答えによって得られるマイナーなパフォーマンスの向上がこの回答の読みやすさを上回っています。どちらも受け入れられました。私が最後に使用した形式は次のとおりです: 'reader = csv.reader(StringIO(response.content.decode( 'utf-8')))'。 – fildred13