Scripts e automação de arquivos

Criar uma lista CSV dos arquivos de uma pasta

Percorra também as subpastas e registre o caminho, a extensão, o tamanho e a data de modificação de cada arquivo. Comece com 4 arquivos de exemplo pequenos e preserve os originais e os resultados existentes.

Ver o sumário

A tradução foi feita com IA. Confira o código, as unidades e os valores junto com o original. A revisão por falantes nativos de cada idioma ainda não foi concluída. 한국어

Para quem éIniciantes em Python que até agora registravam manualmente a quantidade e a localização dos documentos de uma pasta

Preparação
  • Prepare o Python 3.12 ou superior e confira a versão com python --version no terminal.
  • Extraia o ZIP de exemplo em uma nova pasta. Não execute diretamente de dentro do arquivo compactado.
  • Abra o terminal na pasta em que está example.py. Se o comando python não estiver disponível no Windows, use py; no macOS e no Linux, use python3 conforme o ambiente.
  • Não é necessário instalar pacotes externos nem ter uma conta. Os materiais incluídos são dados sintéticos de elaboração própria.

01Criar a primeira lista com quatro arquivos

A criação de uma pasta não basta para considerar esta tarefa concluída. O CSV deve incluir cada um dos quatro arquivos originais uma única vez, o total exibido deve ser de 63 bytes e o conteúdo original deve permanecer intacto. Confira primeiro essas condições com os materiais incluídos e depois amplie o trabalho para suas próprias pastas.

  1. Localize example.py, README.txt e a pasta sample_files na pasta extraída.
  2. Abra sample_files e confira readme.txt, empty.txt e as subpastas docs e reports. empty.txt está vazio de propósito.
  3. Execute o comando abaixo uma vez no terminal. Não mova nem edite os arquivos de entrada durante a execução.
  4. Quando aparecerem a mensagem de conclusão e o caminho de saída, abra outputs/file_list.csv.
bash
python example.py

02Entender os caminhos e as colunas

O código usa como base a localização de example.py, não a pasta atual do terminal. Ele examina apenas sample_files dentro de BASE, por isso você pode mover toda a pasta do exemplo mantendo a mesma estrutura relativa. outputs fica fora da área examinada para que o CSV gerado não volte a se misturar com a lista de entrada.

ColunaSignificadoO que conferir ao ler
relative_pathCaminho relativo a partir de sample_filesArquivos com o mesmo nome são diferenciados quando estão em pastas distintas.
extensionÚltima extensão em letras minúsculasSe não houver extensão, aparece (없음); para tar.gz, a extensão é .gz.
size_bytesTamanho do arquivo como número inteiro de bytes0 indica um arquivo vazio, não um arquivo ausente.
modified_utcData e hora de modificação do arquivo em UTCO sufixo +00:00 indica UTC, que não é o horário local da Coreia.

relative_path usa barras para facilitar a leitura entre sistemas operacionais. Os resultados são ordenados por esse caminho. Como não dependem da ordem interna de busca dos arquivos, fica mais fácil comparar a ordem das linhas para uma mesma entrada.

03Código completo para executar

collect_files reúne as informações e main grava o novo CSV. outputs só é criada após a conferência da entrada. Se encontrar uma pasta que não pode ser lida ou um link, o programa para em vez de salvar uma lista parcial como se fosse um resultado correto.

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 trata a separação das colunas e as aspas do CSV. newline recebe uma string vazia, e o arquivo é salvo com UTF-8 BOM. O arquivo de saída é aberto no modo x para não ser sobrescrito caso já exista outro com o mesmo nome. Neste exemplo, antes disso é verificada a existência da própria pasta outputs.

04Conferir as quatro linhas e o total

relative_pathextensionsize_bytes
docs/agenda.txt.txt15
empty.txt.txt0
readme.txt.txt17
reports/sales.csv.csv31

O total da tabela é 15 + 0 + 17 + 31 = 63 bytes. O terminal também exibe a mensagem de conclusão «완료: 4개 파일, 합계 63바이트». A primeira linha do CSV contém os nomes das colunas, por isso a planilha mostra cinco linhas ao incluir o cabeçalho. Não se esqueça de contar empty.txt.

05Conferir a lista e a preservação dos originais

  1. Compare um a um os quatro caminhos do CSV com as localizações reais em sample_files. As próprias pastas docs e reports não aparecem como linhas de dados.
  2. Confira se o arquivo vazio está incluído com 0 bytes e se as extensões estão diferenciadas como .txt e .csv.
  3. Abra sample_files/readme.txt e confira se o texto original Sample inventory continua presente.
  4. Execute novamente o mesmo comando. Ele deve parar com a mensagem «outputs가 이미 있습니다», que indica que a pasta de saída já existe, e preservar o primeiro resultado.

As condições de recusa também fazem parte do projeto. Não apague o código que bloqueia a saída só porque ele impede uma nova execução. Se precisar preservar o resultado anterior, guarde outputs com outro nome que inclua a data antes de executar novamente, ou extraia o ZIP em uma nova pasta para iniciar outro teste.

06Aplicar à sua própria pasta

Não use toda a sua pasta de trabalho logo no início. Coloque primeiro alguns arquivos representativos em uma cópia de sample_files. Nomes com caracteres coreanos ou espaços são tratados como objetos de caminho. Links simbólicos e diretórios vinculados a outro local não são suportados, por isso é melhor usar uma cópia pequena composta por arquivos comuns.

  1. Preserve a entrada e os resultados do exemplo anterior e crie uma nova pasta de prática.
  2. Coloque em sample_files de 5~10 arquivos que você consiga contar manualmente. Inclua também um nível de subpastas.
  3. Gere a lista e confira se os caminhos relativos apontam para os locais esperados.
  4. Aumente a quantidade de arquivos sem alterar as regras que você conferiu. O tamanho do arquivo pode ser diferente do comprimento do conteúdo, por isso mantenha a unidade em bytes.

Se a pasta de entrada estiver vazia, será gerado um CSV apenas com o cabeçalho, e a contagem de arquivos será 0. Isso é diferente de parar porque a pasta não existe. Uma pasta vazia também pode ser uma situação normal de trabalho; diferencie esses casos ao interpretar os resultados.

07Resolver erros comuns

SintomaPossível causaPróximo passo
O comando python não é encontradoProblema na instalação do interpretador ou na configuração do caminhoConfira primeiro python --version e tente py no Windows.
sample_files deve ser uma pasta realA pasta está ausente ou foi usado um linkConfira se todo o ZIP foi extraído e restaure a pasta real.
outputs já existeRestam resultados de uma execução anteriorGuarde os resultados existentes em outro local e execute novamente.
Os caracteres coreanos aparecem incorretamenteO programa que abre o arquivo interpreta a codificação incorretamenteSelecione UTF-8 ao importar o CSV e não altere o original.
Erro de permissão de leituraPasta inacessível ou caminho bloqueadoReduza primeiro o escopo a uma cópia de prática à qual você tenha acesso.

08O que esta lista garante

O resultado reúne as informações dos arquivos observadas durante a execução. Não é uma verificação de duplicatas por conteúdo nem um backup que permita recuperação. Dois documentos do mesmo tamanho podem ter conteúdos diferentes. Se precisar comparar hashes, adicione esse objetivo e as colunas correspondentes separadamente.

Este exemplo introdutório não trata alterações de nomes ou conteúdo por outros programas durante a busca, atrasos em unidades de rede nem o carregamento de muitos arquivos de uma só vez na memória. Se a gravação em disco falhar durante a saída, poderá restar um outputs incompleto. Confira tanto a mensagem de conclusão quanto a quantidade de linhas do resultado.

Registro de execução e verificação

2026-09-19 · Windows 11 · CPython 3.12.14 · Sem pacotes adicionais · Executado em uma cópia temporária da distribuição

  • Conferidos 4 arquivos, incluindo os de pastas aninhadas, e um total de 63 bytes
  • Uma pasta de entrada vazia gera apenas o cabeçalho
  • Recusa de pasta de entrada inexistente e de outputs já existente
  • Conferida a independência dos caminhos ao executar de outra pasta de trabalho
  • Conferido que o SHA-256 dos arquivos de entrada permanece igual antes e depois da execução
Limites da verificação
  • Não foi executado no macOS nem no Linux.
  • A data de modificação pode mudar após a extração.
  • Não foram testadas alterações simultâneas nos arquivos nem situações de falta de espaço em disco.

Princípios de redação e verificação de todo o site

Arquivos de exemplo para executar

Inclui código, dados de entrada e instruções de execução. Extraia o ZIP e leia primeiro o README.txt.

Baixar ZIP de exemplo

O código de exemplo, os nomes de arquivos e as chaves de entrada são mantidos como no original. Consulte também os comandos e os procedimentos de conferência do texto traduzido.

Material de prática original · Guarde os arquivos originais separadamente antes de executar.

Fontes de referência

As explicações e os exemplos são de elaboração própria. Os comportamentos e conceitos relacionados podem ser consultados nas fontes oficiais abaixo.