添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

现在我想把 strip 文件中的每个值的所有空白和换行都去掉。有什么方法可以遍历字典和嵌套字典及列表中的每个元素吗?

python
json
strip
John West
John West
发布于 2013-06-14
3 个回答
jfs
jfs
发布于 2013-06-14
已采纳
0 人赞同

现在我想把JSON文件中每个值的所有空格和换行都去掉。

使用 pkgutil.simplegeneric() 来创建一个辅助函数 get_items()

import json
import sys
from pkgutil import simplegeneric
@simplegeneric
def get_items(obj):
    while False: # no items, a scalar object
        yield None
@get_items.register(dict)
def _(obj):
    return obj.items() # json object. Edit: iteritems() was removed in Python 3
@get_items.register(list)
def _(obj):
    return enumerate(obj) # json array
def strip_whitespace(json_data):
    for key, value in get_items(json_data):
        if hasattr(value, 'strip'): # json string
            json_data[key] = value.strip()
        else:
            strip_whitespace(value) # recursive call
data = json.load(sys.stdin) # read json data from standard input
strip_whitespace(data)
json.dump(data, sys.stdout, indent=2)

Note: functools.singledispatch()函数(Python 3.4以上)将允许使用collections'MutableMapping/MutableSequence而不是dict/list在这里。

Output

"anotherName": [ "anArray": [ "anotherKey": "value", "key": "value" "anotherKey": "value", "key": "value" "name": [ "someKey": "some Value" "someKey": "another value"
如果我不使用sys,而是想清理一个文件,也就是说,从该文件中读取并写回一个新的json文件,会怎么样?我不知道为什么不能让它工作。【替换代码0/ sys.stdout 对我来说太陌生了,我觉得你的解决方案是专门为单独使用它而设计的。
jfs
@TobiasKolb sys.stdin , sys.stdout 默认为普通的文件对象(正是由内置的 open() 函数返回的对象类型),即。如果你知道如何在 Python 中处理文件,你就知道如何处理 sys.stdin / sys.stdout 。尽管你不需要修改源码来从文件中读取json数据,并将结果写入一个新文件。【替换代码5
Brent Washburne
Brent Washburne
发布于 2013-06-14
0 人赞同

使用以下方法解析文件 JSON :

import json
file = file.replace('\n', '')    # do your cleanup here
data = json.loads(file)

然后走过所产生的数据结构。

Owen
这是不可能的。换行线实际上是字符\和n,所以你需要用''来替换\n。此外,这也不会去除空白。
你可以根据需要定制 "清理 "这一行。 我的Python版本可以很好地清理白色空间。 你可以在走过 "数据 "时清理数值。
Justin S Barrett
Justin S Barrett
发布于 2013-06-14
0 人赞同

这可能不是最有效的过程,但它是有效的。 我把那个样本复制到一个名为 json.txt 的文件中,然后读取它,用 json.loads() 反序列化它,并使用一对函数递归清理它和它里面的所有东西。

import json
def clean_dict(d):
    for key, value in d.iteritems():
        if isinstance(value, list):
            clean_list(value)
        elif isinstance(value, dict):
            clean_dict(value)
        else:
            newvalue = value.strip()
            d[key] = newvalue
def clean_list(l):
    for index, item in enumerate(l):
        if isinstance(item, dict):
            clean_dict(item)
        elif isinstance(item, list):
            clean_list(item)
        else:
            l[index] = item.strip()
# Read the file and send it to the dict cleaner
with open("json.txt") as f:
    data = json.load(f)
print "before..."
print data, "\n"
clean_dict(data)
print "after..."
print data

The result...

before...