Crear una lista CSV de los archivos de una carpeta
Recorre las subcarpetas y registra en una tabla las rutas, extensiones, tamaños y fechas de modificación de los archivos. Empieza con 4 archivos de ejemplo pequeños, manteniendo intactos los originales y los resultados existentes.
Contenido revisado 2026.09.19Incluye archivos de ejemplo
Ver el índice
La traducción se ha realizado con IA. Comprueba el código, las unidades y los valores junto con el original. La revisión por hablantes nativos de cada idioma aún no se ha completado. English
Para quién esPrincipiantes de Python que hasta ahora han enumerado manualmente la cantidad y ubicación de los documentos de una carpeta
Preparación
Instala Python 3.12 o una versión posterior y comprueba la versión en una terminal con python --version.
Extrae el ZIP de ejemplo en una carpeta nueva. No ejecutes el ejemplo desde dentro del archivo ZIP.
Abre una terminal en la carpeta que contiene example.py. Si el comando python no está disponible en Windows, usa py. En macOS o Linux, usa python3 si tu entorno lo requiere.
No se necesitan paquetes externos ni cuentas. Los archivos incluidos son datos sintéticos creados para este tutorial.
01Crea tu primera lista con cuatro archivos
Crear una carpeta de salida no basta para considerar terminada esta tarea. El CSV debe contener exactamente una vez cada uno de los cuatro archivos originales, los tamaños indicados deben sumar 63 bytes y el contenido original debe permanecer sin cambios. Comprueba estas condiciones con los datos incluidos antes de pasar a tu propia carpeta de trabajo.
Busca example.py, README.txt y la carpeta sample_files dentro de la carpeta extraída.
Abre sample_files y comprueba readme.txt, empty.txt y las subcarpetas docs y reports. empty.txt está vacío intencionadamente.
Ejecuta una vez en la terminal el comando indicado a continuación. No muevas ni edites los archivos de entrada mientras se ejecuta.
Cuando aparezcan el mensaje de finalización y la ruta de salida, abre outputs/file_list.csv.
bash
python example.py
02Entiende las rutas y las columnas
El código parte de la ubicación de example.py, no de la carpeta actual de la terminal. Solo recorre sample_files bajo BASE, por lo que puedes mover toda la carpeta del ejemplo siempre que mantengas su estructura interna. outputs está fuera de la carpeta recorrida para que el CSV resultante no pase a formar parte de la lista de entrada en una ejecución posterior.
Columna
Significado
Qué comprobar
relative_path
Ruta relativa a sample_files
Los archivos con el mismo nombre se pueden distinguir si están en carpetas diferentes.
extension
La última extensión, en minúsculas
Si no hay extensión se muestra (없음); tar.gz se muestra como .gz.
size_bytes
Tamaño del archivo como número entero de bytes
0 significa un archivo vacío, no un valor ausente.
modified_utc
Fecha y hora de modificación del archivo en UTC
El +00:00 final significa UTC, que es diferente de la hora local de Corea.
relative_path utiliza barras inclinadas para facilitar la lectura entre distintos sistemas operativos. Los resultados se ordenan por esta ruta. No dependen del orden interno de recorrido de los archivos, lo que facilita comparar el orden de las filas para una misma entrada.
03Código completo utilizado en este ejemplo
collect_files recopila la información de los archivos y main escribe un CSV nuevo. El código no crea outputs hasta que se completan las comprobaciones de entrada. Si encuentra una carpeta que no puede leerse o un enlace, se detiene en lugar de guardar una lista parcial como si fuera un resultado correcto.
example.py
"""sample_files를 읽어 outputs/file_list.csv에 목록을 기록합니다. 원본은 변경하지 않습니다."""
import csv
import os
import sys
from datetime import datetime, timezone
from pathlib import Path
BASE = Path(__file__).resolve().parent
INPUT = BASE / "sample_files"
OUTPUT = BASE / "outputs"
FIELDS = ["relative_path", "extension", "size_bytes", "modified_utc"]
def is_link(path):
# Windows 연결 디렉터리(junction)도 Python 3.12 이상에서는 거부합니다.
return path.is_symlink() or getattr(path, "is_junction", lambda: False)()
def collect_files(folder):
if is_link(folder) or not folder.is_dir():
raise ValueError("sample_files는 실제 폴더여야 합니다.")
rows = []
def stop_on_error(error):
raise error
# 하위 폴더까지 읽되, 링크를 따라 다른 폴더로 나가지 않습니다.
for root, dirs, files in os.walk(folder, followlinks=False, onerror=stop_on_error):
root = Path(root)
for name in dirs + files:
if is_link(root / name):
raise ValueError(f"링크는 처리하지 않습니다: {root / name}")
for name in sorted(files):
path = root / name
if not path.is_file():
raise ValueError(f"일반 파일이 아닙니다: {path}")
stat = path.stat()
rows.append({
"relative_path": path.relative_to(folder).as_posix(),
"extension": path.suffix.lower() or "(없음)",
"size_bytes": stat.st_size,
"modified_utc": datetime.fromtimestamp(
stat.st_mtime, timezone.utc
).isoformat(timespec="seconds"),
})
return sorted(rows, key=lambda row: row["relative_path"])
def main():
if OUTPUT.exists() or OUTPUT.is_symlink():
raise FileExistsError("outputs가 이미 있습니다. 기존 결과를 옮긴 뒤 실행하세요.")
rows = collect_files(INPUT) # 모두 읽은 뒤에만 출력 폴더를 만듭니다.
OUTPUT.mkdir()
target = OUTPUT / "file_list.csv"
# x는 기존 파일을 덮어쓰지 않는 모드입니다. BOM은 한글 CSV 열기에 도움을 줍니다.
with target.open("x", encoding="utf-8-sig", newline="") as stream:
writer = csv.DictWriter(stream, fieldnames=FIELDS)
writer.writeheader()
writer.writerows(rows)
print(f"완료: {len(rows)}개 파일, 합계 {sum(row['size_bytes'] for row in rows)}바이트")
print(target)
return 0
if __name__ == "__main__":
try:
raise SystemExit(main())
except (OSError, ValueError) as error:
print(f"중지: {error}", file=sys.stderr)
raise SystemExit(2)
csv.DictWriter gestiona los delimitadores y las comillas del CSV. El archivo se guarda con newline establecido en una cadena vacía y con BOM UTF-8. El archivo de salida se abre en modo x, de modo que no sobrescribe un archivo que ya exista. Este ejemplo comprueba primero si la propia carpeta outputs ya existe.
04Comprueba las cuatro filas y el tamaño total
relative_path
extension
size_bytes
docs/agenda.txt
.txt
15
empty.txt
.txt
0
readme.txt
.txt
17
reports/sales.csv
.csv
31
La tabla suma 15 + 0 + 17 + 31 = 63 bytes. La terminal también muestra “완료: 4개 파일, 합계 63바이트” (completado: cuatro archivos, sesenta y tres bytes en total). La primera línea del CSV contiene los nombres de las columnas, por lo que una hoja de cálculo muestra cinco filas contando el encabezado. No olvides contar empty.txt.
05Comprueba los originales además de la lista
Relaciona cada una de las cuatro rutas del CSV con su ubicación real en sample_files. Las propias carpetas docs y reports no se incluyen como filas de datos.
Comprueba que el archivo vacío se incluye con un tamaño de 0 bytes y que las extensiones son .txt y .csv.
Abre sample_files/readme.txt y comprueba que el texto original Sample inventory sigue presente.
Ejecuta de nuevo el mismo comando. Debe detenerse con “outputs가 이미 있습니다” (outputs ya existe), y el primer resultado debe permanecer intacto.
Las condiciones de fallo forman parte del diseño. No elimines el código de protección de salida solo porque impide una ejecución repetida. Para conservar los resultados anteriores, cambia el nombre de outputs por uno que incluya una fecha antes de volver a ejecutar, o extrae el ZIP en una carpeta nueva para iniciar una prueba nueva.
06Aplícalo a tu propia carpeta
No apuntes inicialmente el ejemplo a toda tu carpeta de trabajo. Coloca algunos archivos representativos en una copia de sample_files. Los objetos Path gestionan nombres de archivo que contienen caracteres coreanos o espacios. Los enlaces simbólicos y las uniones de directorios que apuntan a otras ubicaciones están fuera del alcance admitido, así que utiliza una copia pequeña que contenga archivos normales.
Conserva las entradas y los resultados del ejemplo existente y crea una carpeta de práctica nueva.
Coloca 5~10 archivos en sample_files para poder contarlos manualmente. Incluye también un nivel de subcarpetas.
Genera la lista y comprueba que las rutas relativas apunten a las ubicaciones esperadas.
Aumenta el número de archivos manteniendo sin cambios las reglas ya comprobadas. El tamaño de un archivo puede diferir de la longitud de su contenido, así que conserva la unidad en bytes.
Si la carpeta de entrada está vacía, el script crea un CSV que solo contiene el encabezado e informa de un recuento de archivos igual a 0. Esto es distinto de detenerse porque la carpeta no existe. Una carpeta vacía puede ser un estado de trabajo válido, así que distingue ambos casos al interpretar los resultados.
07Resuelve errores habituales
Síntoma
Causa posible
Siguiente paso
python command not found
Un problema con la instalación del lanzador de Python o la configuración de la ruta
Comprueba primero python --version y prueba py en Windows.
sample_files must be a real folder
La carpeta no existe o se está utilizando un enlace
Comprueba que has extraído todo el ZIP y restaura una carpeta real.
outputs already exists
Todavía existen resultados de una ejecución anterior
Mueve los resultados existentes a un lugar seguro y vuelve a ejecutar.
Korean text appears garbled
El programa que abre el archivo está interpretando incorrectamente su codificación
Selecciona UTF-8 al importar el CSV y no modifiques el original.
Read permission error
Una carpeta inaccesible o una ruta bloqueada
Reduce primero el alcance a una copia de práctica accesible.
08Qué te indica esta lista y qué no
El resultado contiene información de los archivos observada durante la ejecución. No es una comprobación de contenido duplicado ni una copia de seguridad desde la que puedas restaurar archivos. Dos documentos con el mismo tamaño pueden tener contenidos diferentes. Si necesitas comparaciones mediante hash, defínelas como una tarea independiente y añade las columnas necesarias.
Este ejemplo para principiantes no cubre otros programas que cambien nombres o contenidos durante el recorrido, retrasos de unidades de red ni la recopilación en memoria de cantidades muy grandes de archivos. Un fallo de escritura en disco puede dejar una carpeta outputs incompleta, así que comprueba tanto el mensaje de finalización como el número de filas del resultado.
Registro de ejecución y verificación
2026-09-19 · Windows 11 · CPython 3.12.14 · Sin paquetes adicionales · Ejecutado en una copia temporal de la distribución
Se confirmaron 4 archivos, incluidos archivos de carpetas anidadas, con un total de 63 bytes
Una carpeta de entrada vacía produce un CSV que solo contiene el encabezado
Se rechazan las carpetas de entrada inexistentes y una carpeta outputs ya existente
Se confirmó la independencia del directorio de trabajo ejecutándolo desde otra carpeta
Se confirmaron hashes SHA-256 idénticos para los archivos de entrada antes y después de la ejecución
Límites de la verificación
No se ejecutó en macOS ni Linux.
Las fechas de modificación pueden cambiar después de la extracción.
No se probaron cambios simultáneos de archivos ni espacio en disco insuficiente.
El código de ejemplo, los nombres de archivo y las claves de entrada se mantienen como en el original. Consulta también los comandos y los pasos de comprobación del texto traducido.
Material de práctica original · Guarda los archivos originales por separado antes de ejecutarlo.
Fuentes de referencia
Las explicaciones y los ejemplos son de elaboración propia. Puedes consultar los comportamientos y conceptos relacionados en las siguientes fuentes oficiales.
Combina en orden archivos CSV con la misma estructura de columnas y añade una columna source_file. Usa conjuntos de datos pequeños para comprobar nombres de elementos con comas, columnas faltantes y salidas ya existentes.
Compara los nombres antiguos y nuevos en una tabla y comprueba conflictos. Solo un --apply explícito crea copias en una carpeta nueva, manteniendo los originales.