我想将pandas数据帧作为csv文件上传到服务器而不将其保存在光盘上。有没有办法创造一个或多或少的假csv"假装是真实文件的文件?
以下是一些示例代码: 首先,我从sql查询中获取数据并将其存储为数据帧。 在upload_ga_data函数中,我想要使用这个逻辑
media = MediaFileUpload('df',
mimetype='application/octet-stream',
resumable=False)
完整示例:
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)
答案 0 :(得分:2)
使用stream:
可以实现所需的行为创造一个或多或少"假csv"假装是真实文件的文件
Python使文件描述符(使用open
)和 Stream (使用io.StringIO
)的行为类似。然后,您可以使用文件描述符的任何地方也可以使用字符串流。
创建文本流的最简单方法是使用open(),可选 指定编码:
f = open("myfile.txt", "r", encoding="utf-8")
内存中的文本流也可用作StringIO对象:
f = io.StringIO("some initial text data")
文本流API在文档中有详细描述 TextIOBase。
在Pandas中,您可以使用function中path_or_buf
个signature Array.init n generator
个参数to_csv
来完成此任务:{/ 1}}
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=";")
如果您想要访问流内容,请发出:
>>> stream.getvalue()
';0\n0;0\n1;1\n2;2\n3;3\n4;4\n5;5\n6;6\n7;7\n8;8\n9;9\n'
它返回内容而无需使用真实文件。