Python:将 markdown table 转换为 json
Python: Convert markdown table to json with
我想弄清楚,仅使用 python 将一些降价 table 文本转换为 json 的最简单方法是什么。例如,将其视为输入字符串:
| Some Title | Some Description | Some Number |
|------------|------------------------------|-------------|
| Dark Souls | This is a fun game | 5 |
| Bloodborne | This one is even better | 2 |
| Sekiro | This one is also pretty good | 110101 |
想要的输出应该是这样的:
[
{"Some Title":"Dark Souls","Some Description":"This is a fun game","Some Number":5},
{"Some Title":"Bloodborne","Some Description":"This one is even better","Some Number":2},
{"Some Title":"Sekiro","Some Description":"This one is also pretty good","Some Number":110101}
]
注意:理想情况下,输出应符合 RFC 8259 标准,也就是在键值对周围使用双引号 " 而不是单引号 '。
我见过一些 JS 库可以做到这一点,但仅 python 没有。
有人可以向我解释实现此目的的最快方法是什么,这样我就不必为此编写自己的解析器了。
感谢所有帮助!
您可以将其视为多行字符串并在 \n
和 |
处拆分时逐行解析它
执行此操作的简单代码:
import json
my_str='''| Some Title | Some Description | Some Number |
|------------|------------------------------|-------------|
| Dark Souls | This is a fun game | 5 |
| Bloodborne | This one is even better | 2 |
| Sekiro | This one is also pretty good | 110101 |'''
def mrkd2json(inp):
lines = inp.split('\n')
ret=[]
keys=[]
for i,l in enumerate(lines):
if i==0:
keys=[_i.strip() for _i in l.split('|')]
elif i==1: continue
else:
ret.append({keys[_i]:v.strip() for _i,v in enumerate(l.split('|')) if _i>0 and _i<len(keys)-1})
return json.dumps(ret, indent = 4)
print(mrkd2json(my_str))
[
{
"Some Title": "Dark Souls",
"Some Description": "This is a fun game",
"Some Number": "5"
},
{
"Some Title": "Bloodborne",
"Some Description": "This one is even better",
"Some Number": "2"
},
{
"Some Title": "Sekiro",
"Some Description": "This one is also pretty good",
"Some Number": "110101"
}
]
PS:不知道有没有这样做的图书馆,如果我找到任何东西会更新!
我的方法与@Kuldeep Singh Sidhu 的非常相似:
md_table = """
| Some Title | Some Description | Some Number |
|------------|------------------------------|-------------|
| Dark Souls | This is a fun game | 5 |
| Bloodborne | This one is even better | 2 |
| Sekiro | This one is also pretty good | 110101 |
"""
result = []
for n, line in enumerate(md_table[1:-1].split('\n')):
data = {}
if n == 0:
header = [t.strip() for t in line.split('|')[1:-1]]
if n > 1:
values = [t.strip() for t in line.split('|')[1:-1]]
for col, value in zip(header, values):
data[col] = value
result.append(data)
结果是:
[{'Some Title': 'Dark Souls',
'Some Description': 'This is a fun game',
'Some Number': '5'},
{'Some Title': 'Bloodborne',
'Some Description': 'This one is even better',
'Some Number': '2'},
{'Some Title': 'Sekiro',
'Some Description': 'This one is also pretty good',
'Some Number': '110101'}]
我想弄清楚,仅使用 python 将一些降价 table 文本转换为 json 的最简单方法是什么。例如,将其视为输入字符串:
| Some Title | Some Description | Some Number |
|------------|------------------------------|-------------|
| Dark Souls | This is a fun game | 5 |
| Bloodborne | This one is even better | 2 |
| Sekiro | This one is also pretty good | 110101 |
想要的输出应该是这样的:
[
{"Some Title":"Dark Souls","Some Description":"This is a fun game","Some Number":5},
{"Some Title":"Bloodborne","Some Description":"This one is even better","Some Number":2},
{"Some Title":"Sekiro","Some Description":"This one is also pretty good","Some Number":110101}
]
注意:理想情况下,输出应符合 RFC 8259 标准,也就是在键值对周围使用双引号 " 而不是单引号 '。
我见过一些 JS 库可以做到这一点,但仅 python 没有。 有人可以向我解释实现此目的的最快方法是什么,这样我就不必为此编写自己的解析器了。
感谢所有帮助!
您可以将其视为多行字符串并在 \n
和 |
执行此操作的简单代码:
import json
my_str='''| Some Title | Some Description | Some Number |
|------------|------------------------------|-------------|
| Dark Souls | This is a fun game | 5 |
| Bloodborne | This one is even better | 2 |
| Sekiro | This one is also pretty good | 110101 |'''
def mrkd2json(inp):
lines = inp.split('\n')
ret=[]
keys=[]
for i,l in enumerate(lines):
if i==0:
keys=[_i.strip() for _i in l.split('|')]
elif i==1: continue
else:
ret.append({keys[_i]:v.strip() for _i,v in enumerate(l.split('|')) if _i>0 and _i<len(keys)-1})
return json.dumps(ret, indent = 4)
print(mrkd2json(my_str))
[
{
"Some Title": "Dark Souls",
"Some Description": "This is a fun game",
"Some Number": "5"
},
{
"Some Title": "Bloodborne",
"Some Description": "This one is even better",
"Some Number": "2"
},
{
"Some Title": "Sekiro",
"Some Description": "This one is also pretty good",
"Some Number": "110101"
}
]
PS:不知道有没有这样做的图书馆,如果我找到任何东西会更新!
我的方法与@Kuldeep Singh Sidhu 的非常相似:
md_table = """
| Some Title | Some Description | Some Number |
|------------|------------------------------|-------------|
| Dark Souls | This is a fun game | 5 |
| Bloodborne | This one is even better | 2 |
| Sekiro | This one is also pretty good | 110101 |
"""
result = []
for n, line in enumerate(md_table[1:-1].split('\n')):
data = {}
if n == 0:
header = [t.strip() for t in line.split('|')[1:-1]]
if n > 1:
values = [t.strip() for t in line.split('|')[1:-1]]
for col, value in zip(header, values):
data[col] = value
result.append(data)
结果是:
[{'Some Title': 'Dark Souls',
'Some Description': 'This is a fun game',
'Some Number': '5'},
{'Some Title': 'Bloodborne',
'Some Description': 'This one is even better',
'Some Number': '2'},
{'Some Title': 'Sekiro',
'Some Description': 'This one is also pretty good',
'Some Number': '110101'}]