trabajar - modos de apertura de archivos en python
Cómo leer JSON delimitado por líneas de un archivo grande(línea por línea) (3)
Esto funcionará para el formato de archivo específico que dio. Si su formato cambia, entonces deberá cambiar la forma en que se analizan las líneas.
{
"key11": 11,
"key12": 12
}
{
"key21": 21,
"key22": 22
}
Solo lea línea por línea y genere los bloques JSON a medida que avanza:
with open(args.infile, ''r'') as infile:
# Variable for building our JSON block
json_block = []
for line in infile:
# Add the line to our JSON block
json_block.append(line)
# Check whether we closed our JSON block
if line.startswith(''}''):
# Do something with the JSON dictionary
json_dict = json.loads(''''.join(json_block))
print(json_dict)
# Start a new block
json_block = []
Si está interesado en analizar un archivo JSON muy grande sin guardar todo en la memoria, debe considerar el uso de los métodos de devolución de llamada object_hook o object_pairs_hook en la API json.load.
Estoy intentando cargar un archivo grande (2 GB de tamaño) lleno de cadenas JSON, delimitadas por líneas nuevas. Ex:
{
"key11": value11,
"key12": value12,
}
{
"key21": value21,
"key22": value22,
}
…
La forma en que lo estoy importando ahora es:
content = open(file_path, "r").read()
j_content = json.loads("[" + content.replace("}/n{", "},/n{") + "]")
Lo que parece un truco (agregar comas entre cada cadena JSON y también un corchete al principio y al final para que sea una lista adecuada).
¿Hay una mejor manera de especificar el delimitador JSON (nueva línea /n
lugar de coma)?
Además, parece que Python
no puede asignar correctamente la memoria para un objeto construido a partir de 2GB de datos, ¿hay una manera de construir cada objeto JSON
mientras estoy leyendo el archivo línea por línea? ¡Gracias!
Solo lee cada línea y construye un objeto json en este momento:
with open(file_path) as f:
for line in f:
j_content = json.loads(line)
De esta manera, carga el objeto json completo adecuado (siempre que no haya /n
en un valor json en algún lugar o en medio de su objeto json) y evite problemas de memoria ya que cada objeto se crea cuando es necesario.
También está esta respuesta:
https://.com/a/7795029/671543
contents = open(file_path, "r").read()
data = [json.loads(str(item)) for item in contents.strip().split(''/n'')]