首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确读取包含json格式的文本文件中的数据

正确读取包含json格式的文本文件中的数据
EN

Stack Overflow用户
提问于 2021-08-21 13:01:58
回答 2查看 161关注 0票数 1

假设我有一个文本文件,其中包含以下两个观察:

代码语言:javascript
复制
liame@ziggo.nl:horse22| homeAddress = {
  "city": "AMSTERDAM",
  "houseNumber": "5",
  "houseNumberAddition": null,
  "postalCode": "1111 AN",
  "street": "Walker",
  "__typename": "ShopperAddress"
}
johndoe@live.nl:pizzalover1 | homeAddress = {
  "city": "NEW YOK",
  "houseNumber": "23",
  "houseNumberAddition": null,
  "postalCode": "9999 HV",
  "street": "Marie Curie",
  "__typename": "ShopperAddress"
}

是否有一种方法可以读取此文本文件,使数据框架看起来如下:

代码语言:javascript
复制
username1       username2    city        housenumber  housenumber_addition  postalcode   street      typename
liam@ziggo.nl   horse22      AMSTERDAM   5            null                  1111 AN      Walker      ShopperAddress
johndoe@live.nl pizzalover1  NEW YORK    23           null                  9999 HV      Marie Curie ShopperAddress

Thx

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-21 14:11:59

您的文本文件显示了如何对数据进行编码的模式:

代码语言:javascript
复制
<username1>:<username2> | homeAddress = {
    <json_data>
}

我们将在两次传递中解析该文件:第一次传递将一个记录与另一个记录分离,第二次传递以选择记录中的字段:

  • 记录结束在一行中包含单个"}“字符
  • 使用regex分隔记录

中的字段

代码语言:javascript
复制
import json, re
import pandas as pd

data = []
pattern = re.compile(r"(.+?):(.+?)\s*\|\s*homeAddress = (.+)", re.DOTALL)

with open('data.txt') as fp:
    record = ""
    for line in fp:
        record += line

        if line == "}\n":
            m = pattern.match(record)
            if m:
                username1 = m.group(1)
                username2 = m.group(2)
                home_address = json.loads(m.group(3))
                data.append({
                    "username1": username1,
                    "username2": username2,
                    **home_address
                })
            record = ""

df = pd.DataFrame(data).rename(columns={"__typename": "typename"})
票数 2
EN

Stack Overflow用户

发布于 2021-08-21 15:40:26

您可以稍加修改原始文本,使其成为有效的字典/JSON,并将其提供给pandas.read_json

代码语言:javascript
复制
(pd.read_json('[%s]'%re.sub(r'([^:\n]+):([^\|:]+)\s*\|\s*homeAddress = {',
                            r',{\n  "username1":"\1",\n  "username2":"\2",',
                            text)[1:])
   .rename(columns={'houseNumber': 'housenumber',
                    'houseNumberAddition': 'housenumber_addition',
                    'postalCode': 'postalcode',
                    '__typename': 'typename'})
)

产出:

代码语言:javascript
复制
         username1     username2       city  housenumber  housenumber_addition postalcode       street        typename
0   liame@ziggo.nl       horse22  AMSTERDAM            5                   NaN    1111 AN       Walker  ShopperAddress
1  johndoe@live.nl  pizzalover1     NEW YOK           23                   NaN    9999 HV  Marie Curie  ShopperAddress

中间重加工数据:

代码语言:javascript
复制
[{
  "username1":"liame@ziggo.nl",
  "username2":"horse22",
  "city": "AMSTERDAM",
  "houseNumber": "5",
  "houseNumberAddition": null,
  "postalCode": "1111 AN",
  "street": "Walker",
  "__typename": "ShopperAddress"
}
,{
  "username1":"johndoe@live.nl",
  "username2":"pizzalover1 ",
  "city": "NEW YOK",
  "houseNumber": "23",
  "houseNumberAddition": null,
  "postalCode": "9999 HV",
  "street": "Marie Curie",
  "__typename": "ShopperAddress"
}]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68873272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档