当前位置: 首页 > 面试题库 >

编写CSV以存储在Google Cloud Storage中

张鹏鹍
2023-03-14
问题内容

背景:我正在Python /
AppEngine项目中获取数据并创建一个.tsv文件,以便可以使用d3.js创建图表。现在,我要在每次加载页面时编写CSV文件;我想将文件一次存储在Google云端存储中,然后从那里读取文件。

每次加载页面时,我当前如何编写文件!:

def get(self):  ## this gets called when loading myfile.tsv from d3.js
    datalist = MyEntity.all()
    self.response.headers['Content-Type'] = 'text/csv'
    writer = csv.writer(self.response.out, delimiter='\t')
    writer.writerow(['field1', 'field2'])
    for eachco in datalist:
        writer.writerow([eachco.variable1, eachco.variable2])

虽然效率低下,但效果很好。

使用此Google Cloud
Storage文档
,我一直在尝试使类似的工作正常进行:

def get(self):
    filename = '/bucket/myfile.tsv'
    datalist = MyEntity.all()
    bucket_name = os.environ.get('BUCKET_NAME', app_identity.get_default_gcs_bucket_name())
    write_retry_params = gcs.RetryParams(backoff_factor=1.1)
    writer = csv.writer(self.response.out, delimiter='\t')
    gcs_file = gcs.open(filename, 'w', content_type='text/csv', retry_params=write_retry_params)
    gcs_file.write(writer.writerow(['field1', 'field2']))
    for eachco in datalist:
        gcs_file.write(writer.writerow([eachco.variable1, eachco.variable2]))
    gcs_file.close()

但是我得到了:

TypeError: Expected str but got <type 'NoneType'>.

我以为csv.writer的输出将是一个字符串,所以我不确定为什么会收到TypeError。

所以我可以想到两种情况:

  1. 我在将tsv写入Cloud Storage的代码中搞砸了。遍历并将TSV / CSV文件写入Cloud Storage应该很简单,对吧?
  2. 我完全采用了完全错误的方法,甚至应该使用BlobStore或db.TextProperty()来存储此.tsv数据。(文件不是那么大;绝对小于1MB)

我将不胜感激!

编辑-完整回溯

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1530, in __call__
    rv = self.router.dispatch(request, response)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "/mydirectory/myapp/handlers.py", line 21, in dispatch
    webapp2.RequestHandler.dispatch(self)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/mydirectory/myapp/thisapp.py", line 384, in get
    gcs_file.write(writer.writerow(['field1', 'field2']))
  File "lib/cloudstorage/storage_api.py", line 754, in write
    raise TypeError('Expected str but got %s.' % type(data))
TypeError: Expected str but got <type 'NoneType'>.

问题答案:

您仍在尝试根据响应创建作者:

writer = csv.writer(self.response.out, delimiter='\t')

您需要写入GCS文件。像这样:

    datalist = MyEntity.all()
    bucket_name = os.environ.get('BUCKET_NAME', app_identity.get_default_gcs_bucket_name())
    filename = os.path.join(bucket_name, 'myfile.tsv')
    write_retry_params = gcs.RetryParams(backoff_factor=1.1)
    gcs_file = gcs.open(filename, 'w', content_type='text/csv', retry_params=write_retry_params)
    writer = csv.writer(gcs_file, delimiter='\t')
    writer.writerow(['field1', 'field2'])
    for eachco in datalist:
        writer.writerow([eachco.variable1, eachco.variable2])
    gcs_file.close()

笔记:

  • 尚未实际测试
  • 我还调整了文件名以使用 bucket_name
  • 如果您在get()请求中执行此操作,则可能需要检查文件是否已存在,如果存在,请使用它,否则您仍会在每次请求时生成该文件。或者,您可以将此代码移至任务或.tsv上载处理程序中。


 类似资料:
  • 我正在尝试使用pyspark来分析我在数据砖笔记本上的数据。Blob 存储已装载到数据砖群集上,在分析后,希望将 csv 写回 blob 存储。由于 pyspark 以分布式方式工作,csv 文件被分解为小块并写入 Blob 存储。如何克服这个问题,并在我们使用pyspark进行分析时在blob上编写为单个csv文件。谢谢。

  • 问题内容: 我有以下格式的数据: 我想将其写入CSV。下面是我的代码: 方法“ writeNext”仅允许使用String []作为参数。当我尝试使用Object []将’ArrayList each’强制转换为String []时,如下所示,我遇到了运行时类型强制转换错误: 谁能告诉我我要去哪里错了? 问题答案: 你不能投入,因为可以包含狗,猫,整型等。 您应该使用重载的List#toArray

  • 问题内容: 我正在学习如何编写存储过程。我知道了,但我没有。我知道事情是这样的。 因此,我被困住了,我试图理解的是。编写一个存储过程,该过程接受一个Territory ID,Territory Description和Region ID,并将它们作为新行插入Northwind的Territories表中。 好吧,我知道我可以做这样的事情,我相信: 但是那我可能是错的。但我不知道在哪里插入然后作为表

  • 我试图将一个用编写的函数迁移到 实时解压缩并逐行读取 对每一行执行一些光转换 将未压缩的输出(一次一行或块)写入GCS 输出是>2GB,但略小于3GB,所以它适合。 null AFAIC,我将坚持,因为输出可以放入内存--就目前而言--但是多部分上传是以最少的内存支持任何输出大小的方法。 想法还是替代方案?

  • 问题内容: 我试图在Windows计算机上使用Python 3.2编写一个简单的CSV文件,但是我没有运气。从Python 3.2 的csv模块文档中: 产生一个文件,该文件的每一行都以字节序列结尾,因此当您使用MS Excel等打开文件时,每行看起来都有一个多余的空行。这不是“ CSV文件”。 请注意,如果我在Python 3.2中尝试相同的Python 2.7示例(最大的区别在于文件模式与vs

  • 如何使用表(X)作为输入参数编写Oracle存储过程,并且在过程中使用表X与另一个表Y联接? 表X将有数千条记录。 不希望将表名传递为varchar,然后使用动态SQL(因此,此选项不在画面中)

  • CSV存储引擎使用逗号分隔值格式的文本文件存储数据。 要允许使用这个存储引擎,当你建立MySQL之时,使用--with-csv-storage-engine选项来configure。 当你创建一个CSV表之时,服务器在数据库目录创建一个表定义文件。文件由表的名字开始,并且由一个.frm的扩展名。存储引擎也创建一个数据文件。它的名字由表的名字开始,并且有一个.CSV的扩展名。数据文件是无格式文本文件

  • 我在PHP中有一个CSV字符串,它被mb_detect_编码检测为UTF8。此字符串将写入文件。当我在文本编辑器(程序员记事本)中打开它时,编辑器会说它是UTF8无标记的,当我将编码更改为ANSI时,它会在Excel中正确打开。我想用ANSI编写这个文件,这样在Excel中打开它之前就不必在文本编辑器中进行转换。尝试使用以下命令: utf8_解码($xhtml) iconv(“UTF-8”、“Wi