通过 Python 将 CSV 文件上传到 Fusion Tables

Uploading CSV files to Fusion Tables through Python

我正在尝试从 looker 获取数据并使用 MediaFileUpload 将其直接插入 Google Fusion Tables,以便不下载任何文件并从内存上传。我当前的代码 returns 出现 TypeError。任何帮助,将不胜感激。谢谢!

返回给我的错误:

Traceback (most recent call last):
  File "csvpython.py", line 96, in <module>
    main()
  File "csvpython.py", line 88, in main
    media = MediaFileUpload(dataq, mimetype='application/octet-stream', resumable=True)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/oauth2client/_helpers.py", line 133, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/googleapiclient/http.py", line 548, in __init__
    fd = open(self._filename, 'rb')
  TypeError: expected str, bytes or os.PathLike object, not NoneType

有问题的代码:

for x, y, z in zip(look, destination, fusion):    

    look_data = lc.run_look(x)
    df = pd.DataFrame(look_data)
    stream = io.StringIO()
    dataq = df.to_csv(path_or_buf=stream, sep=";", index=False)
    media = MediaFileUpload(dataq, mimetype='application/octet-stream', resumable=True)
    replace = ftserv.table().replaceRows(tableId=z, media_body=media, startLine=None, isStrict=False, encoding='UTF-8', media_mime_type='application/octet-stream', delimiter=';', endLine=None).execute()

在 MediaFileUpload 中将 dataq 切换为流后,我得到了以下返回信息:

 Traceback (most recent call last):
   File "quicktestbackup.py", line 96, in <module>
     main()
   File "quicktestbackup.py", line 88, in main
     media = MediaFileUpload(stream, mimetype='application/octet-stream', resumable=True)
   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/oauth2client/_helpers.py", line 133, in positional_wrapper
     return wrapped(*args, **kwargs)
   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/googleapiclient/http.py", line 548, in __init__
     fd = open(self._filename, 'rb')
   TypeError: expected str, bytes or os.PathLike object, not _io.StringIO

DataFrame.to_csv is a void method 和调用它的任何副作用都会传递给 stream 而不是 dataq。也就是说,dataqNoneType 并且没有数据 - 您的 CSV 数据在 stream.
中 当您从 io 对象构造媒体文件时,您需要从流(而不是流本身)向它提供数据,因此需要它的 getvalue() method

df.to_csv(path_or_buf=stream, ...)
media = MediaFileUpload(stream.getvalue(), ...)

对 FusionTables 的调用看起来完全有效。