有没有办法在不导入 csv 的情况下从 .csv 创建 JSON?

Posted

技术标签:

【中文标题】有没有办法在不导入 csv 的情况下从 .csv 创建 JSON?【英文标题】:Is there a way to create JSON from .csv without importing csv? 【发布时间】:2019-11-30 17:51:28 【问题描述】:

我有一些来自 Google 表格的简单 csv 数据,我想使用 Python 将其格式化为 JSON,以便将其发布到 API。

有没有办法在不导入csv 的情况下做到这一点?

Zapier 不支持导入 requests 以外的任何内容。

csv 数据示例:

Name,ID,Price,Qty
Row 1,123,100,1
Row 2,123,56,2
Row 3,123,90,3
Row 4,213,68,5
Row 5,765,987,789
Row 6,123,123,123

更新:这就是我所在的位置:

Zapier screenshot

但我得到了错误:

    File "<string>", line 11, in the_function
NameError: name 'data' is not defined

【问题讨论】:

[替换Row的字符串,用],替换\n的字符串,然后把它扔到另一组[ ]中?如果不是列表列表,可能有助于指定您希望输出的 JSON 的样子 不确定这是否适用于可变数量的行,我认为它需要循环和格式化。 当然,这里有详细说明:zapier.com/apps/code/help#requiring-or-using-external-libraries 刚刚看到更新的问题 - 我建议您输入预期格式的输出 JSON 根据他们的documentation - Only the standard Python library and requests is available。所以import csv应该被允许,因为它是一个标准的Python库。 【参考方案1】:

David 来自 Zapier 平台团队。

就像其他人提到的那样,data.csv = ... 不是有效的 python,因此你的错误。

为了提供一些上下文,您的 python 代码设置如下:

# this is done automatically, behind the scene
s = """Name,ID,Price,Qty
Row 1,123,100,1
Row 2,123,56,2
Row 3,123,90,3
Row 4,213,68,5
Row 5,765,987,789
Row 6,123,123,123"""

input_data = "data": s

所以要解析它,你的代码应该是这样的:

import csv

result = 
with csv.reader(input_data['data'].splitlines()) as r:
    for line in r:
        # organize the data how you want
        pass

return result

这应该可以让您将数据转换为您想要的任何形状!

您提到想要将数据发送到 API - 您也可以在此代码步骤中执行此操作。见HTTP examples。

【讨论】:

酷!如果此答案解决了您的问题,请确保对其进行投票并将其标记为正确 (info)。【参考方案2】:

错误是因为 data.csv 不是一个有效的变量名,你不能有 '.'在那里。

我不知道 Zapier 是如何工作的,但如果您尝试从名为“data.csv”的文件中读取数据并且想要以下格式的输出

["name": "Row", "ID": 1, "Price": 100, "Qty":1, ...

那就试试

# Reading each line the data.csv file into a list
with open("data.csv", "r") as f:
    input = f.readlines()
input = [i.strip('\n\r') for i in input] # Strip new line characters

s = "["
for k in input[1:]: # For every line except for the header
  s += '"Name": "", "ID": , "Price": , "Qty": , '.format(*k.split(","))
s += "]"

如果您尝试从变量“input_data”解析测试(看起来您正在尝试这样做)然后尝试。

input = input_data['data'].split("\n")

s = "["
for k in input[1:]: # For every line except for the header
  s += '"Name": "", "ID": , "Price": , "Qty": , '.format(*k.split(","))
s += "]"

【讨论】:

我明白了,这很有趣,但它从哪里获取数据?我在上面分享了一个屏幕截图。【参考方案3】:

根据zapier documentation:

只有标准的 Python 库和请求可用。

因此,import csvimport json 将被允许,因为它们是标准 Python 库。

这取决于您希望 JSON 输出格式是什么格式。一个非常简单直接的转换是使用标准 Python csvjson 库,如下所示:

import csv
import json

with open('data.csv') as f_input:   
    data = list(csv.DictReader(f_input))

with open('data.json', 'w') as f_output:
    json.dump(data, f_output, indent=3)

给你一个输出JSON文件如下:

[
   
      "Name": "Row 1",
      "ID": "123",
      "Price": "100",
      "Qty": "1"
   ,
   
      "Name": "Row 2",
      "ID": "123",
      "Price": "56",
      "Qty": "2"
   ,
   
      "Name": "Row 3",
      "ID": "123",
      "Price": "90",
      "Qty": "3"
   ,
   
      "Name": "Row 4",
      "ID": "213",
      "Price": "68",
      "Qty": "5"
   ,
   
      "Name": "Row 5",
      "ID": "765",
      "Price": "987",
      "Qty": "789"
   ,
   
      "Name": "Row 6",
      "ID": "123",
      "Price": "123",
      "Qty": "123"
   
]

【讨论】:

以上是关于有没有办法在不导入 csv 的情况下从 .csv 创建 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用表格的情况下从 BigQuery 中的 csv 文件中检索数据

BigQuery - 如何在不使用列名作为值的情况下导入 CSV?

有没有办法在不破坏格式的情况下在 CSV 列中包含逗号?

从关闭的 CSV 更新 MS Access 数据表而不导入

有没有办法在不安装任何驱动程序的情况下将表从雪花导入 R 中的数据帧?

使用 jquery-datatables 获取数据