MarkItDown
Lectura del código de MarkItDown: una conversión de texto UTF-8
Examina el núcleo y PlainTextConverter en un commit fijo para entender aceptación, decodificación, restauración del flujo y pruebas de regresión específicas.
Qué aprenderás
- El conversor acepta metadatos antes de decodificar bytes.
- Un charset declarado cambia la ruta de decodificación.
- Las pruebas de cursor y salida vacía cubren contratos diferentes.
Antes de empezar
- Conocimientos básicos de Python y terminal
- Un documento no sensible con contenido verificable
Utiliza la lista del capítulo para explicar y verificar esta parte de una ingesta documental.
Conclusiones clave
- El conversor acepta metadatos antes de decodificar bytes.
- Un charset declarado cambia la ruta de decodificación.
- Las pruebas de cursor y salida vacía cubren contratos diferentes.
Empieza por dos archivos pequeños
Este recorrido inspecciona _markitdown.py y converters/_plain_text_converter.py en el commit b6e8bbdce628d564c6af031b5f26cda6e818ea10. Comienza por el método público de entrada, continúa por el bucle _convert y termina en PlainTextConverter. Las observaciones corresponden a esos archivos, no demuestran el comportamiento de todos los conversores PDF, Office o en la nube.
Una muestra UTF-8 con un encabezado y una palabra acentuada facilita seguir el recorrido. Entrega los bytes con extensión y charset adecuados en StreamInfo e inspecciona el Markdown. El ejemplo es una muestra de regresión para ejecutar en el entorno fijado, no un benchmark ni una ejecución medida para este artículo.
Aceptar y decodificar son operaciones separadas
PlainTextConverter.accepts devuelve verdadero cuando StreamInfo contiene un charset. Si no lo contiene, comprueba extensiones reconocidas y prefijos MIME. El método consulta metadatos sin consumir el flujo, cumpliendo la condición que impone el despachador.
PlainTextConverter.convert lee los bytes y utiliza el charset declarado cuando está presente. En caso contrario, solicita el mejor resultado a charset_normalizer y lo convierte en texto. Lo envuelve en DocumentConverterResult; no inventa un esquema documental ni deduce tablas a partir de texto arbitrario.
Convierte la lectura en pruebas concretas
Prueba el contrato del flujo con un conversor personalizado cuyo sondeo de aceptación lea bytes y vuelva después a la posición original. Una versión deliberadamente incorrecta que deje el cursor avanzado debería revelar la aserción del despachador. Esa prueba resulta más diagnóstica que recorrer archivos no relacionados y comparar únicamente códigos de salida.
Prueba una codificación declarada inválida por separado de un formato desconocido. La excepción de decodificación ocurre después de aceptar la entrada y pertenece a la ruta de intentos fallidos. Prueba también un conversor que devuelva texto vacío: puede existir un objeto de resultado que la aplicación de ingesta deba rechazar.
Pasos de implementación
- 1
Fija el commit citado y lee los dos archivos enlazados.
- 2
Ejecuta la muestra BytesIO en ese entorno.
- 3
Añade un charset inválido y examina la excepción.
- 4
Prueba un sondeo personalizado que restaure el cursor.
Ejemplo para copiar
from io import BytesIO
from markitdown import MarkItDown, StreamInfo
stream = BytesIO("# Example\n\nCafé\n".encode("utf-8"))
result = MarkItDown(enable_plugins=False).convert_stream(
stream, stream_info=StreamInfo(extension=".txt", charset="utf-8")
)
assert "Café" in result.markdown
print(result.markdown)Preguntas frecuentes
¿Es análisis de código o una traza de ejecución medida?
Es un análisis de los archivos citados con muestras para ejecutar. No presenta mediciones de ejecución.
¿La conversión de texto reconstruye estructura semántica?
El conversor inspeccionado decodifica bytes y devuelve texto. Los encabezados de la muestra ya forman parte de su entrada.
Fuentes
- Documentación fijadaFuente verificada 2026-09-07
- Despachador centralFuente verificada 2026-09-07
- Conversor de textoFuente verificada 2026-09-07
- Exportaciones públicasFuente verificada 2026-09-07