有没有办法在不导入 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 csv
和 import json
将被允许,因为它们是标准 Python 库。
这取决于您希望 JSON 输出格式是什么格式。一个非常简单直接的转换是使用标准 Python csv
和 json
库,如下所示:
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?