O módulo CSV já existe no Python há algum tempo. Uma das joias escondidas nele é a classe Sniffer , que tentará determinar quais são suas regras de cotação e qual delimitador está sendo usado. Muito bom para importar dados de fontes desconhecidas.
A documentação que sugere usá-lo assim:
with open('example.csv', 'rb') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
# ... process CSV file contents here ...
Descobri que isso é um pouco sujeito a erros e falha com mais frequência do que deveria. E o que dá errado, ao que parece, é o truncamento arbitrário no caractere 1024. Uma solução mais eficaz que encontrei é apenas fornecer algumas linhas:
with open('example.csv', 'rb') as csvfile:
sample_text = ''.join(csvfile.readline()
for x in xrange(3))
dialect = csv.Sniffer().sniff(sample_text)
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
# ... process CSV file contents here ...
Em seguida, passa de 85% bom para 95% bom.