2

我想做类似的事情:

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_file不是类型file

这里的最佳做法是什么?

资料来源:

4

1 回答 1

1

正如文档所解释的:

csvfile可以是任何支持迭代器协议并在每次next()调用其方法时返回一个字符串的对象——文件对象和列表对象都适用。

因此,如果您有一些不是文件,而是行上的迭代器,那很好。如果它甚至不是跨行的迭代器,只需将其包装在一个中即可。对于一个简单的例子,如果它是一个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 文件很大,特别是如果它们需要一段时间才能到达并且您有一个不错的流媒体界面,您可能不想以这种方式一次阅读整个内容。大多数网络服务器框架都提供了很好的协议适配器,例如,获取字节流并为您提供行流。(就此而言,即使socket.makefile()在 stdlib 中也是如此……)但就您而言,我认为这不是问题。

于 2013-08-06T00:34:28.247 回答