python - 将文件读入字典 - 用大括号分隔,没有逗号分隔符

Posted

技术标签:

【中文标题】python - 将文件读入字典 - 用大括号分隔,没有逗号分隔符【英文标题】:python - read file into dictionary - delimited with curly brackets, no comma delimiter 【发布时间】:2018-06-30 09:58:28 【问题描述】:

我是 python 新手(pandas、numPy 等)。 我想知道以最佳和高效的方式解决此任务的完美方法。

我有一个具有以下格式的大文件 - 希望所有内容都在一行中:

"order_reference":"0658-2147","billing_address_zip_code":"8800"
"order_reference":"0453-2200","billing_address_zip_code":"8400"
"order_reference":"0554-3027","billing_address_zip_code":"8820"
"order_reference":"0382-3108","billing_address_zip_code":"3125"
"order_reference":"0534-4059","billing_address_zip_code":"3775"
"order_reference":"0118-1566","billing_address_zip_code":"3072"
"order_reference":"0384-6897","billing_address_zip_code":"8630"
"order_reference":"0361-5226","billing_address_zip_code":"4716"
"order_reference":"0313-6812","billing_address_zip_code":"9532"
"order_reference":"0344-6262","billing_address_zip_code":"3600"

将这个文件读入python中的字典或numPy中的dataFrame的最简单方法是什么?我们的目标是将 billing_address_zip_code 加入到一个大的 JSON 文件中,以便更深入地了解 order_reference。

我想用 regExp 解决它,但由于文件很大,需要加入另一个文件,我想我应该使用 Pandas,不是吗? 或者由于所有数据集的长度相同,我也可以按长度插入

有没有使用熊猫的功能?我想这将是最快的方式,但由于它不是标准的 JSON,我不知道该怎么做。

对于初学者的问题,我很抱歉,但是我在互联网上搜索了很多,找不到正确的答案。它真的会帮助我找出处理这类任务的正确方法。 对于任何帮助或链接,我非常感谢。 西蒙

PS:您使用哪种云环境来完成此类任务?哪个最适合 python 和数据科学库?

更新

我使用下面的代码格式化成一个有效的 JSON 并成功地用 json.loads() 加载它:

#syntay: python 3
import json

#small test file
my_list = "["+open("orders_play_around.json").read().replace("",",\n")+"]"

d = json.loads(my_list)

到目前为止一切顺利。现在是下一个挑战,如何将这个 json 字典与另一个在 billing_address_zip_code 上有连接的 JSON 文件连接起来? 另一个 JSON 如下所示:


"data": [

  "BFS-Nr": 1,
  "Raum mit städtischem Charakter 2012": 4,
  "Typologie der MS-Regionen 2000 (2)": 3,
  "E": 679435,
  "Zusatzziffer": 0,
  "Agglomerationsgrössenklasse 2012": 1,
  "Gemeinde-typen (9 Typen) 2000 (1)": 4,
  "N": 235653,
  "Stadt/Land-Typologie 2012": 3,
  "Städte 2012": 0,
  "Gemeinde-Grössenklasse 2015": 7,
  "BFS Nr.": 1,
  "Sprachgebiete 2016": 1,
  "Europäsiche Berggebietsregionen (2)": 1,
  "Gemeindename_1": "Aeugst am Albis",
  "Anwendungsgebiete für Steuerer-leichterungen 2016": 0,
  "Kantonskürzel": "ZH",
  "Kanton": 1,
  "Metropolräume 2000 (2)": 1,
  "PLZ": 8914,
  "Bezirk": 101,
  "Gemeindetypologie 2012\n(25 Typen)": 237,
  "Raumplanungs-regionen": 105,
  "Gemeindetypologie 2012\n(9 Typen)": 23,
  "Agglomerationen und Kerne ausserhalb Agglomerationen 2012": 261,
  "Ortschaftsname": "Aeugst am Albis",
  "Arbeitsmarktregionen 2000 (2)": 10,
  "Gemeinde-typen\n(22 Typen) 2000 (1)": 11,
  "Städtische / Ländliche Gebiete 2000 (1)": 2,
  "Gros-s-regionen": 4,
  "Gemeindename": "Aeugst am Albis",
  "MS-Regionen (2)": 4,
  "Touris-mus Regionen 2017": 3,
  "DEGURBA 2011 eurostat": 3
,
....

在来自 plz.js 的密钥 PLZ 和来自 orders_play_around.json 的 billing_address_zip_code 上加入他们的最简单方法是什么? 我可以毫无问题地将它加载到 JSON 文件中:

plz_data=open('plz.js').read()
plz = json.loads(plz_data)

抱歉,消息太长了。但希望有人可以帮助我解决这个简单的问题。目标是将其绘制在地图或图表上,以便我可以看到哪个 PLZ(邮政编码)的订单最多。

【问题讨论】:

花括号是否一个接一个地,立即,在一个巨大的行中?中间没有空格?是通过 SED 等其他工具更改文件,还是仅使用 Python? 是的,它在一个巨大的文件中,中间没有空格。如果它是一个小文件,我只需用“,”搜索+替换“”以获得标准 JSON。但由于它是一个巨大的文件,我想使用一些云计算能力并使用 Python(熊猫等)。但我会尝试使用 SED,也许这也可以。你会使用 SED 处理大文件吗? 当然,我会把它作为答案发布 - 如果它有效,请告诉我。 【参考方案1】:

既然您提到将文件转换为正确的 JSON 是您的初始目标,并且您不介意 sed,请尝试:

sed 's||\n|g' originalfile > result

请注意,我添加了换行符,而不是逗号。可能对您未来的编辑更好。您可以使用-i 标志,以便sed 就地编辑,但这更安全。如果您真的想使用 Python,那么使用标准 Python 并没有什么大不了的。最安全的是逐字阅读:

with open("originalfile") as fd:
    while True:
        ch=fd.read(1)
        if not ch: break
        if ch =="": print("\n")
        print(ch,end="")

或者只是替换和打印(从未测试过 Python 的限制,我猜这会起作用:

print(open("originalfile").read().replace("","\n"))

为此不需要regex - 这有点矫枉过正。一旦这是一个正确的Json 文件,它将更易于使用,包括通过pandas.read_json 加载Json

【讨论】:

非常感谢。 SED:不知何故,它仅在我使用 sed 's||, |g' orders_play_around.json > result.txt 创建一个新行时才起作用,\n 在我的 mac 操作系统上不起作用。关于 JSON 负载,我写了另一个答案。 @sspaeti 欢迎您。无需说谢谢 - 接受答案,让每个人都看到它已解决,如果您想多谢,请投票。 完美我已经做到了?? 刚刚添加了一个后续,如何基于键连接两个数据集。希望得到一些帮助,否则,我将接受答案并关闭问题。 @sspaeti 您可能正在寻找merge。这需要另一个问题,但我确信有人问过它(如何合并到 Pandas 中的数据框)。请不要随时更改问题-关闭此问题,进行更多研究,如果遇到困难,请发布一个新问题。祝你好运。【参考方案2】:

这是一种方法。

data = []
with open("originalfile") as fp:
    for l in fp:
        clean_line = ([x.replace("","").replace("\n","").replace("\"","") for x in l.split(",")])
        data.append(clean_line)

然后你可以将数据列表转换成pandas数据框并导出为JSON。

df = pandas.DataFrame(data)
df.to_json()

如果你想删除文本,例如“billing_address_zip_code”,只保留数据,然后就可以了

data = []
with open(filepath) as fp:
    for l in fp:
        splitted = ([x.split(":")[1] for x in l.split(",")])
        data.append(([x.replace("\n","").replace("\"","") for x in splitted]))

【讨论】:

以上是关于python - 将文件读入字典 - 用大括号分隔,没有逗号分隔符的主要内容,如果未能解决你的问题,请参考以下文章

python数据结构之字典

Python-字典dic和集合set

Python 字典dict操作定义

Python 映射类型字典dict操作定义

Python基础之字典

将括号分隔的字符串拆分为字典