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 - 将文件读入字典 - 用大括号分隔,没有逗号分隔符的主要内容,如果未能解决你的问题,请参考以下文章