我正在摆弄输出一个json文件,其中包含目录中文件的一些属性.我的问题是,当附加到文件时,每个对象之间没有分隔符.我可以在每个'f'之后添加一个逗号并删除最后一个,但这对我来说似乎是一个草率的工作.
import os
import os.path
import json
#Create and open file_data.txt and append
with open('file_data.txt', 'a') as outfile:
files = os.listdir(os.curdir)
for f in files:
extension = os.path.splitext(f)[1][1:]
base = os.path.splitext(f)[0]
name = f
data = {
"file_name" : name,
"extension" : extension,
"base_name" : base
}
json.dump(data, outfile)
Run Code Online (Sandbox Code Playgroud)
这输出:
{"file_name": "contributors.txt", "base_name": "contributors", "extension": "txt"}{"file_name": "read_files.py", "base_name": "read_files", "extension": "py"}{"file_name": "file_data.txt", "base_name": "file_data", "extension": "txt"}{"file_name": ".git", "base_name": ".git", "extension": ""}
我想要的是实际的JSON:
{"file_name": "contributors.txt", "base_name": "contributors", "extension": "txt"},{"file_name": "read_files.py", "base_name": "read_files", "extension": "py"},{"file_name": "file_data.txt", "base_name": "file_data", "extension": "txt"}{"file_name": ".git", "base_name": ".git", "extension": ""}
aba*_*ert 11
你得到的不是JSON对象,而是一组独立的JSON对象.
你想要的仍然不是一个JSON对象,而是一个单独的JSON对象流,它们之间有逗号.这不会再那么麻烦了.*
*JSON规范很简单,可以手工解析,应该非常清楚,一个对象后跟另一个逗号介于两者之间的对象与任何有效的生成都不匹配.
如果您正在尝试创建JSON数组,则可以执行此操作.除非存在内存问题,否则显而易见的方法是构建一个dicts列表,然后立即转储所有内容:
output = []
for f in files:
# ...
output.append(data)
json.dump(output, outfile)
Run Code Online (Sandbox Code Playgroud)
如果内存是一个问题,你有几个选择:
[,,和]手动.(但请注意,在最后一个值之后有一个额外的尾随逗号是无效的JSON,即使某些解码器会接受它.)data,并扩展JSONEncoder以将迭代器转换为数组.(请注意,这实际上是用作为什么以及如何扩展的文档中的示例JSONEncoder,尽管您可能希望编写更具内存效率的实现.)但是,值得考虑你要做的事情.也许一系列独立的JSON对象实际上是您正在尝试做的正确的文件格式/协议/ API.因为JSON是自定界限的,所以没有理由在单独的值之间添加分隔符.(除非你使用的分隔符不会出现在实际的JSON中,否则它对稳健性甚至没有多大帮助,.)例如,你得到的就是JSON-RPC正是如此.本来应该是这样的.如果您只是因为不知道如何解析这样的文件而要求不同的东西,这很容易.例如(为简单起见,使用字符串而不是文件):
i = 0
d = json.JSONDecoder()
while True:
try:
obj, i = d.raw_decode(s, i)
except ValueError:
return
yield obj
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12152 次 |
| 最近记录: |