python abre arquivo de texto com um espaço entre cada personagem
-
03-07-2019 - |
Pergunta
Sempre que tento abrir um arquivo .csv com o comando python
fread = open('input.csv', 'r')
ele sempre abre o arquivo com espaços entre cada personagem. Eu estou supondo que é algo errado com o arquivo de texto, porque eu posso abrir outros arquivos de texto com o mesmo comando e eles são carregados corretamente. Alguém sabe por que um arquivo de texto iria carregar como este em python?
Graças.
Atualizar
Ok, eu consegui com a ajuda de de Jarret Hardie pós
este é o código que eu usei para converter o arquivo para ascii
fread = open('input.csv', 'rb').read()
mytext = fread.decode('utf-16')
mytext = mytext.encode('ascii', 'ignore')
fwrite = open('input-ascii.csv', 'wb')
fwrite.write(mytext)
Obrigado!
Solução
A mensagem por recursiva é provavelmente certo ... o conteúdo do arquivo são provavelmente codificados com um charset multi-byte. Se este é, de fato, o caso, você provavelmente pode ler o arquivo em si python sem ter que convertê-lo pela primeira vez fora de python.
Tente algo como:
fread = open('input.csv', 'rb').read()
mytext = fread.decode('utf-16')
O flag 'b' garante o arquivo é lido como dados binários. Você precisa saber (ou adivinhar) a codificação original ... neste exemplo, eu usei utf-16, mas YMMV. Isto irá converter o arquivo para unicode. Se você realmente tem um arquivo com caracteres multi-byte, eu não recomendo convertendo-a em ascii como você pode acabar perdendo um monte de personagens no processo.
EDIT: Obrigado por fazer o upload do arquivo. Há dois bytes na frente do arquivo que indica que ele, de fato, usar uma grande charset. Se você está curioso, abra o arquivo em um editor hexadecimal como alguns sugeriram ... você vai ver algo na versão de texto como 'I.D. |.' (Etc). O ponto é o byte extra para cada caractere.
O código trecho acima parece funcionar na minha máquina com esse arquivo.
Outras dicas
O arquivo está codificado em alguns codificação unicode, mas você está lendo-o como ascii. Tente converter o arquivo para ascii antes de usá-lo em python.
Não é CSV um arquivo txt simples com valores separados por vírgulas. Basta tentar abri-lo com um editor de texto para ver se o arquivo é formado corretamente.
Para ler um arquivo codificado, você pode simplesmente substituir open
com codecs.open
.
fread = codecs.open('input.csv', 'r', 'utf-16')
Nunca tinha ocorrido a mim, mas como truppo disse, deve haver algo de errado com o arquivo.
Tente abrir o arquivo em Excel / BrOffice Calc e salvar como o arquivo como CSV novamente.
Se os persiste problema, tente um subconjunto dos dados:. Punho 10 / últimos 10 / intermediárias 10 linhas do arquivo
Ok, eu consegui com a ajuda de de Jarret Hardie pós
este é o código que eu usei para converter o arquivo para ascii
fread = open('input.csv', 'rb').read()
mytext = fread.decode('utf-16')
mytext = mytext.encode('ascii', 'ignore')
fwrite = open('input-ascii.csv', 'wb')
fwrite.write(mytext)
Obrigado!
Abra o arquivo em modo binário, 'rb'. Verificá-lo em um editor hexadecimal e verificar se há nula estofamento '00'. Abra o arquivo em algo como Scintilla Editor de Texto para verificar os personagens presentes no arquivo.
Aqui é a maneira rápida e fácil, esp se python não vai analisar a entrada corretamente
sed 's/ \(.\)/\1/g'