鱼C论坛

 找回密码
 立即注册
查看: 1876|回复: 15

[已解决]如何将JSON文件里需要的部分提取出来

[复制链接]
发表于 2021-11-19 21:23:51 | 显示全部楼层 |阅读模式
60鱼币
   将附件里面JSON文件中需要的信息提取出来,如每个小列表中的 “2723975”,以及名字“热带低压”。

   不知道代码该怎么写,想了一些方法都行不通,求大佬帮忙指点一下,万分感谢。
最佳答案
2021-11-19 21:23:52
祢豆子oo 发表于 2021-11-20 13:30
大佬,我还需要点信息,就是一共需要每个列表中的如{2723975,"nameless","热带低压","20210022"}这四个信 ...
import re
def solution():
    with open(r'C:\Users\Administrator\Desktop\list_2021.txt',encoding="utf-8") as f:
        s = f.read()

    r = re.compile(r'\[([^[].*?),"(.*?)","(.*?)",.*?,"(.*?)",')
    for i in r.findall(s, re.M|re.I):
        print(i)
solution()
'''
('2723975', 'nameless', '热带低压', '20210022')
('2724099', 'MALOU', '玛瑙', '2120')
('2717929', 'NAMTHEUN', '南川', '2119')
('2713966', 'KOMPASU', '圆规', '2118')
('2713815', 'LIONROCK', '狮子山', '2117')
('2707799', 'MINDULLE', '蒲公英', '2116')
('2707635', 'DIANMU', '电母', '2115')


'''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-19 21:23:52 | 显示全部楼层    本楼为最佳答案   
祢豆子oo 发表于 2021-11-20 13:30
大佬,我还需要点信息,就是一共需要每个列表中的如{2723975,"nameless","热带低压","20210022"}这四个信 ...
import re
def solution():
    with open(r'C:\Users\Administrator\Desktop\list_2021.txt',encoding="utf-8") as f:
        s = f.read()

    r = re.compile(r'\[([^[].*?),"(.*?)","(.*?)",.*?,"(.*?)",')
    for i in r.findall(s, re.M|re.I):
        print(i)
solution()
'''
('2723975', 'nameless', '热带低压', '20210022')
('2724099', 'MALOU', '玛瑙', '2120')
('2717929', 'NAMTHEUN', '南川', '2119')
('2713966', 'KOMPASU', '圆规', '2118')
('2713815', 'LIONROCK', '狮子山', '2117')
('2707799', 'MINDULLE', '蒲公英', '2116')
('2707635', 'DIANMU', '电母', '2115')


'''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-19 21:24:49 | 显示全部楼层
附件

list_2021.zip

1.2 KB, 下载次数: 7

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-19 22:51:28 | 显示全部楼层

先说结论,可以用遍历的方法获取你所需要的数据。

这个文本文档中的字符串的主要部分其实是一个字典结构。我们把这个字符串稍微格式化一下就能看到,文本中第2-26行是一个,单键值字典, 唯一的key是"typhoonList",value是一个列表,列表中的每一项是一条数据,每条数据也是一个列表,列表的第1、3项就是你需要的数据,这个python 只要学过,想提取出来就不难

typhoon_jsons_list_2021(
    {"typhoonList":[[2723975,"nameless","热带低压",null,"20210022",20210022,null,"stop"],
                    [2724099,"MALOU","玛瑙",2120,"2120",null,"名字来源于:中国澳门 意为:玛瑙","stop"],
                    [2717929,"NAMTHEUN","南川",2119,"2119",null,"名字来源于:老挝 意为:河","stop"],
                    [2713966,"KOMPASU","圆规",2118,"2118",20210020,"名字来源于:日本 意为:圆规星座","stop"],
                    [2713815,"LIONROCK","狮子山",2117,"2117",20210019,"名字来源于:中国香港 意为:香港一座远眺九龙半岛的山峰名称","stop"],
                    [2707799,"MINDULLE","蒲公英",2116,"2116",null,"名字来源于:朝鲜 意为:一种小黄花,春天开放,蒲公英属,是朝鲜妇女淳朴识礼的象征","stop"],
                    [2707635,"DIANMU","电母",2115,"2115",20210017,"名字来源于:中国 意为:神化中的雷电之神","stop"],
                    [2689244,"CHANTHU","灿都",2114,"2114",null,"名字来源于:柬埔寨 意为:一种花","stop"],
                    [2688277,"CONSON","康森",2113,"2113",null,"名字来源于:越南 意为:古迹","stop"],
                    [2686219,"OMAIS","奥麦斯",2112,"2112",null,"名字来源于:美国 意为:漫游(Palauan 语)","stop"],
                    [2681119,"NIDA","妮妲",2111,"2111",null,"名字来源于:泰国 意为:女士名字","stop"],
                    [2681195,"MIRINAE","银河",2110,"2110",null,"名字来源于:韩国 意为:宇宙的银河","stop"],
                    [2679495,"LUPIT","卢碧",2109,"2109",20210011,"名字来源于:菲律宾 意为:残酷","stop"],
                    [2670840,"NEPARTAK","尼伯特",2108,"2108",null,"名字来源于:密克罗尼西亚 意为:著名的勇士(Kosrae 语)","stop"],
                    [2659831,"CEMPAKA","查帕卡",2107,"2107",20210009,"以其芬芳的花闻名的植物","stop"],
                    [2659279,"IN-FA","烟花",2106,"2106",null,"名字来源于:中国澳门 意为:烟花","stop"],
                    [2659097,"nameless","热带低压",null,"20210007",20210007,null,"stop"],
                    [2659075,"nameless","热带低压",null,"20210006",20210006,null,"stop"],
                    [2656478,"CHAMPI","蔷琵",2105,"2105",null,null,"stop"],
                    [2655955,"KOGUMA","小熊\n",2104,"2104",20210004,"小熊星座","stop"],
                    [2653775,"CHOI-WAN","彩云",2103,"2103",null,null,"stop"],
                    [2644377,"SURIGAE","舒力基",2102,"2102",null,"一种鹰","stop"],
                    [2641936,"DUJUAN","杜鹃",2101,"2101",null,null,"stop"]
                    ]
     }
    )
另外,提供另外一个思路,这种有规律的字符串可以用正则来处理(知识点百度关键字"python 正则")。这里你需要列表的1,3项,比如第一条数据中为:2723975,"nameless","热带低压"。匹配规则很明显是【7位数字,"若干字母和-","若干中文字符"]】,使用这个模式可以匹配到所有的类似  2723975,"nameless","热带低压" 的字符串,剩下的就很简单了,split处理一下就好了~,当然这是我的思路,其实用正则的方法很多,比如你匹配每个列表也行,单独匹配【[7位数字,】获取第1个也行,自己观察规律就好了。具体的解法还是放给楼主自己做吧,多做几次以后遇到同类问题很快就能解决,勤用百度。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-19 23:49:50 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-11-19 23:52 编辑
import json 

with open('list_2021.txt', 'r', encoding='utf-8') as f:
    json_str = f.readlines()[0][24:-1]
    json_data = json.loads(json_str)
    for i in json_data['typhoonList']:
        # print(i)  # 查看一下 (注意是一个列表哦)
        pass 

# 若需要用pandas,对数据进行进一步处理,可以这样:
import pandas as pd
df = pd.DataFrame(json_data['typhoonList'])
print(df) 

# 再进一步,可以重命名列名
# …… 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 09:57:26 | 显示全部楼层
import re
def solution():
    with open(r'C:\Users\Administrator\Desktop\list_2021.txt',encoding="utf-8") as f:
        s = f.read()

    r = re.compile(r'\[([^[].*?),.*?,"(.*?)",')
    for i in r.findall(s, re.M|re.I):
        print(i)
solution()
'''
('2723975', '热带低压')
('2724099', '玛瑙')
('2717929', '南川')
('2713966', '圆规')
('2713815', '狮子山')
('2707799', '蒲公英')
('2707635', '电母')
('2689244', '灿都')
('2688277', '康森')
('2686219', '奥麦斯')
('2681119', '妮妲')
('2681195', '银河')
('2679495', '卢碧')
('2670840', '尼伯特')
('2659831', '查帕卡')
('2659279', '烟花')
('2659097', '热带低压')
('2659075', '热带低压')
('2656478', '蔷琵')
('2655955', '小熊\\n')
('2653775', '彩云')
('2644377', '舒力基')
('2641936', '杜鹃')


'''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 10:01:35 | 显示全部楼层
kaohsing 发表于 2021-11-20 09:57
import re
def solution():
    with open(r'C:%users\Administrator\Desktop\list_2021.txt',encoding=" ...

哈哈哈。一看老哥就是天天刷题的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 10:11:08 | 显示全部楼层
lightninng 发表于 2021-11-20 10:01
哈哈哈。一看老哥就是天天刷题的。

哈哈😄,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-20 12:00:23 | 显示全部楼层

有几个问题还需要请教一下:
(1)json_str = f.readlines()[0][24:-1]中的[0]代表什么意思呢?
(2)Traceback (most recent call last):
  File "D:\adjust.py", line 11, in <module>
    import pandas as pd
ModuleNotFoundError: No module named 'pandas'
       这种提示怎么解决?
(3)我只需要每个列表中的如{2723975,"nameless","热带低压","20210022"}这四个信息该怎么写代码呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 13:09:41 | 显示全部楼层
读入是个列表,0是取列表的第一个元素。
你没有装pandas。
i[0:4]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-20 13:30:54 | 显示全部楼层
kaohsing 发表于 2021-11-20 09:57
import re
def solution():
    with open(r'C:%users\Administrator\Desktop\list_2021.txt',encoding=" ...

大佬,我还需要点信息,就是一共需要每个列表中的如{2723975,"nameless","热带低压","20210022"}这四个信息用正则表达式该怎么写代码呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-20 13:35:20 | 显示全部楼层
kaohsing 发表于 2021-11-20 13:09
读入是个列表,0是取列表的第一个元素。
你没有装pandas。
i[0:4]

pandas怎么装呢,我百度的结果都是说直接Import=-=
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 14:22:49 | 显示全部楼层
祢豆子oo 发表于 2021-11-20 13:35
pandas怎么装呢,我百度的结果都是说直接Import=-=

搜一搜pip,
如果用pycharm那就简单
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 14:27:51 | 显示全部楼层
这个数据是网站返回jsonp,说白了就是一字符串己,不截取就用正则,截取就用字典
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-20 21:16:37 | 显示全部楼层

真的是万分感谢
python我还有好多没学到的,比如正则就还不会。大佬写的compile里的内容我还有些看不懂,等我这两天研究研究,要是还有看不懂还得来请教一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-21 11:55:17 | 显示全部楼层
lightninng 发表于 2021-11-19 22:51
先说结论,可以用遍历的方法获取你所需要的数据。这个文本文档中的字符串的主要部分其实是一个字典结构。 ...

谢谢大佬提供思路,正则我还没看看到,准备学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 19:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表