2013-08-06 74 views
1

我想要做的事,如:龍捲風:讀取上傳的CSV文件?

import csv 
import tornado.web 

class MainHandler(tornado.web.RequestHandler): 
    def post(self): 
     uploaded_csv_file = self.request.files['file'][0] 
     with uploaded_csv_file as csv_file: 
      for row in csv.reader(csv_file): 
       self.write(' , '.join(row)) 

但是,uploaded_csv_filefile型沒有。

這裏的最佳做法是什麼?

來源:

回答

1

由於the documentation解釋說:

csvfile可以是任何支持迭代器協議的對象,每次調用它的方法時都會返回一個字符串 - 文件對象和列表對象都適用。

所以,如果你有不是文件的東西,而是線上的迭代器,那很好。如果它甚至不是線上的迭代器,只是將它包裝在一箇中。對於一個簡單的例子,如果這件事情有read_all()方法,你總是可以做到這一點:

uploaded_csv_file = self.request.files['file'][0] 
contents = uploaded_csv_file.read_all() 
lines = contents.splitlines() 
for row in csv.reader(lines): 
    # ... 

(很明顯,你可以合併步驟在一起,使它簡短一些;我剛寫的每一步作爲一個獨立的行,使其更容易理解)。

當然,如果CSV文件很大,特別是如果他們需要一段時間才能到達,並且您有一個很好的流媒體界面,那麼您可能不希望一次讀取所有內容這條路。大多數網絡服務器框架都提供了很好的協議適配器,例如,可以接收一串字節併爲您提供一系列線路。 (就此而言,即使stdlib中的socket.makefile()也能做到這一點......)但在你的情況下,我不認爲這是一個問題。