如何将pandas dataframe转换为JSON/utf-8并提交回gitlab,以便将其读取为CSV

goqiplq2  于 2023-04-18  发布在  Git
关注(0)|答案(1)|浏览(107)

我可以使用pandas和python-gitlab成功地读取这样的CSV:

filename = "file.csv"
    f = project.files.get(file_path=filename, ref='master')
    data = pd.read_csv(StringIO(str(f.decode(),'utf-8')), sep=',', header=None, names=["direction", "width", "height"])

但是我无法将正确的结构返回到json中,然后由gitlab读取为CSV。
gitlab上的csv文件示例如下所示,因此您可以看到其结构

import csv, requests
from io import StringIO

url = "https://gitlab.com/datasets_a/mpg-data/-/raw/master/mpg.csv"
# Reading URL data
s = requests.get(url).content
# Decoding & formatting
data=csv.reader(StringIO(s.decode('utf-8')))
#Printing the first 5 rows
for row in list(data)[:5]:
    print(row)

而且我似乎不能将dataframe转换为json -这是我的尝试!

def make_payload_commit(project, Time, filename, data):
        # payload
        data = {
                'branch': 'main',
                'commit_message': Time,
                'actions': [
                {
                        'action': 'update',
                        'file_path': filename,
                        'content': dataframe.to_json(),
                }
                ]
        }
        commit = project.commits.create(data)

gitlab不会将其注册为CSV。
将感谢任何帮助,如果有人知道如何做到这一点!

ltskdhd1

ltskdhd11#

很有可能,由于一些编码问题,您的.csv文件无法识别。要解决此问题,您可以通过base64 module使用Base64编码对文件进行编码。
下面是一个使用pandasgithub将您提供的文件内容上传到所选存储库的工作示例:

import pandas as pd
import base64
import requests
import json

url = "https://gitlab.com/datasets_a/mpg-data/-/raw/master/mpg.csv"
# Reading URL data
data_orig = pd.read_csv(url, index_col=0)

# Convert the DataFrame to a CSV string
csv_str = data_orig.to_csv(index=False)

# Encode the CSV string as base64
base64_content = base64.b64encode(csv_str.encode('utf-8')).decode('utf-8')

headers = {
    "Authorization": "Bearer  <YOUR TOKEN>",
    "Accept": "application/vnd.github.v3+json"
}

# Create the request payload
payload = {
    "message": "add new csv file",
    "content": base64_content,
    "branch": "main"
}

# Convert the payload to JSON
json_payload = json.dumps(payload)

# Send the request to create the file
response = requests.put(<REQUEST GIT REPO URL>, headers=headers, data=json_payload)

生成的文件被上传到玩具存储库here
您应该能够通过gitlab实现相同的效果,方法是将action的encoding属性设置为base64(参见文档),如下所示:

data = {
        'branch': 'main',
        'commit_message': Time,
        'actions': [
        {
                'action': 'update',
                'file_path': filename,
                'content': base64_content,
                'encoding': 'base64'
        }
        ]
}

希望这能帮上忙。

相关问题