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

时间:2018-01-21 18:30:59

标签: python json pandas numpy dictionary

我是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,
  "Grossregionen": 4,
  "Gemeindename": "Aeugst am Albis",
  "MS-Regionen (2)": 4,
  "Touris-mus Regionen 2017": 3,
  "DEGURBA 2011 eurostat": 3
},
{....}
}

从plz.js和 billing_address_zip_code 从orders_play_around.json加入关键 PLZ 的最简单方法是什么? 我可以毫无问题地将它加载到JSON文件中:

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

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

2 个答案:

答案 0 :(得分:0)

由于您提到将文件转换为正确的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文件,它就会更容易使用,包括通过Json加载pandas.read_json

答案 1 :(得分:0)

这是一种方式。

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]))