Python 3:如何在不保存磁盘的情况下将熊猫数据帧作为csv流上传?

brn*_*ccc 1 python csv dataframe python-3.x pandas

我想将csv文件将pandas数据帧上传到服务器而不将其保存在光盘上。有没有办法创建或多或少的伪造成真实文件的“假csv”文件?

这是一些示例代码:首先,我从sql查询中获取数据并将其存储为数据框。在upload_ga_data函数中,我想使用此逻辑

 media = MediaFileUpload('df',
                      mimetype='application/octet-stream',
                      resumable=False)
Run Code Online (Sandbox Code Playgroud)

完整示例:

from __future__ import print_function
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient.errors import HttpError
from apiclient.http import MediaFileUpload
import pymysql
import pandas as pd
con = x

ga_query = """
    SELECT XXXXX
    """

df = pd.read_sql_query(ga_query,con)

df.to_csv('ga_export.csv', sep=',', encoding='utf-8', index = False)

def upload_ga_data():
    try:
        media = MediaFileUpload('ga_export.csv',
                          mimetype='application/octet-stream',
                          resumable=False)
        daily_upload = service.management().uploads().uploadData(
                accountId=accountId,
                webPropertyId=webPropertyId,
                customDataSourceId=customDataSourceId,
                media_body=media).execute()
        print ("Upload was successfull")
    except TypeError as error:
      # Handle errors in constructing a query.
      print ('There was an error in constructing your query : %s' % error)
Run Code Online (Sandbox Code Playgroud)

jla*_*rcy 5

使用stream可以实现所需的行为:

创建或多或少的伪造的“ csv”文件

Python使File Descriptor(带有open)和Stream(带有io.StringIO)的行为类似。然后,可以使用文件描述符的任何地方都可以使用字符串流。

创建文本流的最简单方法是使用open(),可以选择指定编码:

f = open("myfile.txt", "r", encoding="utf-8")
Run Code Online (Sandbox Code Playgroud)

内存中文本流也可用作StringIO对象:

f = io.StringIO("some initial text data")
Run Code Online (Sandbox Code Playgroud)

TextIOBase文档中详细描述了文本流API。

在Pandas中,您可以使用签名中带有参数的任何函数来完成此操作,例如:path_or_bufto_csv

DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, mode='w', encoding=None, compression=None, quoting=None, quotechar='"', line_terminator='\n', chunksize=None, tupleize_cols=None, date_format=None, doublequote=True, escapechar=None, decimal='.')

以下代码将CSV格式的虚拟DataFrame导出到字符串流(不是物理文件,而是内存中的八位字节流):

import io
import pandas as pd

df = pd.DataFrame(list(range(10)))

stream = io.StringIO()
df.to_csv(stream, sep=";")
Run Code Online (Sandbox Code Playgroud)

当您想访问流内容时,只需发出:

>>> stream.getvalue()
';0\n0;0\n1;1\n2;2\n3;3\n4;4\n5;5\n6;6\n7;7\n8;8\n9;9\n'
Run Code Online (Sandbox Code Playgroud)

它返回内容,而无需使用实际文件。