Combinar vários CSVs e manter o nome de cada arquivo de origem
Combine em ordem arquivos CSV com a mesma estrutura de colunas e adicione a coluna source_file. Confira com dados pequenos os nomes de itens com vírgulas, as colunas ausentes e as saídas já existentes.
Conteúdo verificado 2026.09.19Inclui arquivos de exemplo
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 querem reunir em uma única tabela arquivos CSV separados por data ou responsável
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.
01Combinar dois arquivos em cinco linhas
Se os números parecerem incorretos depois de combinar vários arquivos, pode ser difícil localizar sua origem. Este exemplo mantém as quatro colunas existentes e adiciona source_file ao final. O objetivo é identificar o arquivo de origem diretamente em cada linha do resultado. Antes de começar, some as 2 e 3 linhas de dados dos dois arquivos e anote o resultado esperado: 5.
Localize inputs/sales_01.csv e inputs/sales_02.csv na pasta extraída.
Abra os dois arquivos em um editor de texto e confira se a primeira linha é date,item,quantity,unit_price.
Execute o comando abaixo no terminal, a partir da pasta que contém example.py.
Abra outputs/merged.csv e confira as cinco linhas de dados e a coluna source_file.
bash
python example.py
As pastas de entrada e saída são separadas, para que um merged.csv anterior não se misture aos arquivos de entrada ao executar novamente. A busca das entradas também usa como referência fixa a localização de example.py. Se você extrair o ZIP mantendo a estrutura das pastas, não precisará alterar os caminhos.
02Padronizar as colunas antes de combinar
Coluna de entrada
Valor de exemplo
Tratamento neste artigo
date
2026-09-01
A string é mantida como está
item
노트
É mantido, incluindo vírgulas e aspas
quantity
2
É mantido como string, sem cálculos
unit_price
2500
É mantido como string, sem cálculos
Não apenas os nomes das colunas devem coincidir, mas também sua ordem. Por exemplo, o programa para se um arquivo usar qty no lugar de quantity ou alterar a posição de unit_price. Como ele não tenta adivinhar o significado nem ajustar as colunas automaticamente, você percebe imediatamente quando formatos de outros departamentos foram misturados.
Os dados sintéticos incluem «메모지, 대형» e «표지 "파랑"», que contém aspas duplas. Ler um CSV separando-o simplesmente por vírgulas com split pode dividir esses valores incorretamente. Deixe o módulo padrão csv tratar as regras de aspas e grave novamente as linhas como foram lidas.
03Código completo para executar
collect_rows confere o cabeçalho e as linhas de cada CSV e adiciona o nome do arquivo de origem. main cria a nova saída somente depois que todas as verificações passam. Essa ordem evita deixar um resultado com apenas os primeiros arquivos combinados caso as colunas de um arquivo posterior estejam incorretas.
example.py
"""inputs의 같은 구조 CSV를 결합합니다. 각 행에 원본 파일명을 붙입니다."""
import csv
import sys
from pathlib import Path
BASE = Path(__file__).resolve().parent
INPUT = BASE / "inputs"
OUTPUT = BASE / "outputs"
FIELDS = ["date", "item", "quantity", "unit_price"]
def collect_rows():
if INPUT.is_symlink() or not INPUT.is_dir():
raise ValueError("inputs 폴더가 없거나 링크입니다.")
if getattr(INPUT, "is_junction", lambda: False)():
raise ValueError("연결 디렉터리는 처리하지 않습니다.")
# inputs 바로 아래의 .csv 파일만 읽습니다. 순서를 명시해 결과를 재현합니다.
paths = sorted(
(p for p in INPUT.iterdir() if p.suffix.lower() == ".csv"),
key=lambda p: p.name.casefold(),
)
if not paths:
raise ValueError("inputs에 CSV 파일이 없습니다.")
merged = []
counts = []
for path in paths:
if path.is_symlink() or not path.is_file():
raise ValueError(f"일반 CSV 파일이 아닙니다: {path.name}")
with path.open("r", encoding="utf-8-sig", newline="") as stream:
reader = csv.DictReader(stream, strict=True)
if reader.fieldnames != FIELDS:
raise ValueError(f"{path.name}: 열 이름과 순서는 {FIELDS}여야 합니다.")
count = 0
for row in reader:
# 열이 많으면 None 키, 적으면 None 값이 생깁니다.
if None in row or any(value is None or not value.strip() for value in row.values()):
raise ValueError(f"{path.name}, {reader.line_num}행: 열 수 또는 빈 값을 확인하세요.")
merged.append({**row, "source_file": path.name})
count += 1
counts.append((path.name, count))
return merged, counts
def main():
if OUTPUT.exists() or OUTPUT.is_symlink():
raise FileExistsError("outputs가 이미 있습니다. 기존 결과를 옮긴 뒤 실행하세요.")
rows, counts = collect_rows() # 모든 파일을 검증한 다음에 출력합니다.
OUTPUT.mkdir()
target = OUTPUT / "merged.csv"
with target.open("x", encoding="utf-8-sig", newline="") as stream:
writer = csv.DictWriter(stream, fieldnames=FIELDS + ["source_file"])
writer.writeheader()
writer.writerows(rows)
for name, count in counts:
print(f"{name}: {count}행")
print(f"완료: {len(counts)}개 파일 → {len(rows)}행")
print(target)
return 0
if __name__ == "__main__":
try:
raise SystemExit(main())
except (OSError, ValueError, csv.Error) as error:
print(f"중지: {error}", file=sys.stderr)
raise SystemExit(2)
A verificação usa o fato de que DictReader cria uma chave None quando há colunas de dados em excesso e valores None quando faltam colunas. Também são recusadas strings vazias ou compostas apenas por espaços. newline recebe uma string vazia, e a codificação é definida para tratar UTF-8 BOM, mantendo consistência nas quebras de linha e nos caracteres coreanos.
04Conferir a quantidade de linhas e sua origem
Ordem dos dados no resultado
item
quantity
source_file
1
노트
2
sales_01.csv
2
펜
3
sales_01.csv
3
노트
1
sales_02.csv
4
메모지, 대형
4
sales_02.csv
5
표지 "파랑"
1
sales_02.csv
O terminal exibe, nesta ordem, «sales_01.csv: 2행», «sales_02.csv: 3행» e «완료: 2개 파일 → 5행». O cabeçalho, que é a primeira linha do resultado, não entra na contagem dos dados. A presença de 노트 em duas linhas não é um erro: são mantidas linhas originais distintas, sem calcular totais nem remover duplicatas.
05Fazer quatro conferências antes de confiar no resultado
Confira se a soma das linhas das entradas, 5, coincide com a quantidade de linhas de dados do resultado.
Confira se há duas linhas com source_file igual a sales_01.csv e três com o valor sales_02.csv.
Confira se o nome do item com vírgula continua em uma única célula e se as aspas duplas não desapareceram.
Abra novamente os dois arquivos originais para conferir se o conteúdo permanece igual e verifique se uma nova execução para porque outputs já existe.
No trabalho real, conferir a quantidade de linhas é diferente de conferir os totais. Mesmo que o valor total coincida por acaso, uma linha pode estar ausente e outra ter sido incluída duas vezes. Como ainda não há cálculos nesta etapa, é mais claro comparar primeiro as contagens por origem e o texto original.
06Praticar adicionando um terceiro arquivo
Para executar novamente, guarde o primeiro outputs com outro nome. Adicione sales_03.csv dentro de inputs, com o mesmo cabeçalho e uma linha de dados. A contagem esperada passa a ser de seis linhas. Confira também se source_file na nova linha contém sales_03.csv para entender a relação entre adicionar uma entrada e a coluna de rastreamento.
São incluídos apenas arquivos com extensão .csv localizados diretamente em inputs. O programa não percorre subpastas recursivamente nem combina notas de texto ou pastas de trabalho do Excel. Se não houver nenhum CSV, ele considera que a entrada foi escolhida incorretamente e para. Um CSV válido apenas com cabeçalho conta como 0 linhas e não impede a combinação dos demais arquivos.
07Conferir os erros em vez de aceitar resultados parciais
Causa da interrupção
Onde conferir
Como corrigir
Nomes de colunas ou ordem diferentes
Primeira linha do arquivo indicado
Ajuste para corresponder exatamente às quatro colunas exigidas.
Erro na quantidade de colunas ou valores vazios
Nome do arquivo e número da linha indicado
Verifique células ausentes, separadores extras e valores vazios.
Erro nas aspas do CSV
Aspas duplas não fechadas
Use uma cópia cuja estrutura tenha sido corrigida em um editor de CSV.
Erro de codificação
Formato em que o arquivo de entrada foi salvo
Crie uma cópia exportada novamente em UTF-8.
outputs já existe
Pasta de resultados anterior
Mova os resultados e execute novamente.
O número da linha do erro corresponde às linhas físicas lidas do CSV. Em um CSV complexo com quebras de linha dentro de valores entre aspas, ele pode diferir do número da linha de dados da planilha. Use primeiro o nome do arquivo na mensagem para identificar qual original deve ser conferido.
08Diferenciar combinação e validação de dados
Este script verifica a estrutura das colunas, os valores vazios e a sintaxe CSV. Ele não determina se quantity é um número, se date é uma data real ou se os valores monetários seguem as regras do negócio. Se precisar fazer cálculos após combinar, adicione uma etapa separada de validação para a conversão numérica e os intervalos permitidos.
Como reúne todas as linhas na memória e salva somente após verificá-las, ele é adequado para praticar com arquivos de trabalho pequenos. CSVs muito grandes exigem um projeto com saídas temporárias e processamento por etapas. Um erro de disco durante o salvamento pode deixar resultados parciais; não considere a execução bem-sucedida se faltar a mensagem de conclusão. Alterações simultâneas nas entradas e falhas em caminhos de rede ficam fora do escopo da verificação.
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
Combinados 2 CSVs em 5 linhas e conferidas as contagens de source_file
Preservação de células com vírgulas e aspas duplas
Recusa de cabeçalhos incorretos, colunas ausentes ou extras, valores vazios e aspas incorretas antes de criar a saída
Tratamento de CSVs apenas com cabeçalho e da ausência de CSVs
Conferido que o SHA-256 dos originais permanece igual e que as saídas existentes são preservadas
Limites da verificação
O uso de memória com arquivos grandes não foi medido.
O significado dos números e das datas conforme as regras do negócio não é validado.
O sistema operacional usado para verificar a execução é o Windows.
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.
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.
Confira em uma tabela os nomes atuais e os novos e verifique possíveis conflitos. Somente ao informar --apply são criadas cópias em uma nova pasta, preservando os originais.