Caractere de nova linha CSV visto em erro de campo não citado


121

o código a seguir funcionou até hoje quando importei de uma máquina Windows e recebi este erro:

caractere de nova linha visto no campo não citado - você precisa abrir o arquivo no modo de nova linha universal?

import csv

class CSV:


    def __init__(self, file=None):
        self.file = file

    def read_file(self):
        data = []
        file_read = csv.reader(self.file)
        for row in file_read:
            data.append(row)
        return data

    def get_row_count(self):
        return len(self.read_file())

    def get_column_count(self):
        new_data = self.read_file()
        return len(new_data[0])

    def get_data(self, rows=1):
        data = self.read_file()

        return data[:rows]

Como posso corrigir esse problema?

def upload_configurator(request, id=None):
    """
    A view that allows the user to configurator the uploaded CSV.
    """
    upload = Upload.objects.get(id=id)
    csvobject = CSV(upload.filepath)

    upload.num_records = csvobject.get_row_count()
    upload.num_columns = csvobject.get_column_count()
    upload.save()

    form = ConfiguratorForm()

    row_count = csvobject.get_row_count()
    colum_count = csvobject.get_column_count()
    first_row = csvobject.get_data(rows=1)
    first_two_rows = csvobject.get_data(rows=5)

A resposta de rectummelancolique abaixo é o que resolveu meu problema semelhante. stackoverflow.com/a/17315726/3131666
kmantel

Respostas:


181

Será bom ver o próprio arquivo csv, mas isso pode funcionar para você, tente, substitua:

file_read = csv.reader(self.file)

com:

file_read = csv.reader(self.file, dialect=csv.excel_tab)

Ou, abra um arquivo com universal newline modee passe-o para csv.reader, como:

reader = csv.reader(open(self.file, 'rU'), dialect=csv.excel_tab)

Ou use splitlines()assim:

def read_file(self):
    with open(self.file, 'r') as f:
        data = [row for row in csv.reader(f.read().splitlines())]
    return data

Isso agora dá o mesmo erro, mas on-line iniciando upload.num_records = csvobject.get_row_count () now
#

1
e quando eu experimentar a versão linhas de divisão (que é muito esfria obrigado) eu me coagir a Unicode: string necessidade ou tampão, S3BotoStorageFile encontrada
GrantU

4
Que opção acabou por funcionar? Btw, você está lendo o arquivo duas vezes: dentro get_row_count()e dentro get_column_count()- considere ler o arquivo __init__e lembre-se datade self.data, em seguida, use-o em outros métodos.
alecxe

+1 para linhas de divisão (), que evita mexer com diferentes opções de formatação no OSX. Esperança que funciona em outras plataformas também ...
python1981

Ótima resposta. No entanto, usando - "dialect = csv.excel_tab", estraga a saída quando usado com csv.DictReader. Porém, apenas as opções 'rU' funcionam magicamente #
Murphy

52

Percebo que este é um post antigo, mas encontrei o mesmo problema e não vejo a resposta correta, por isso vou tentar

Erro Python:

_csv.Error: new-line character seen in unquoted field

Causado ao tentar ler arquivos CSV do Macintosh (pré-formatados no OS X). Esses são arquivos de texto que usam CR para final de linha. Se estiver usando o MS Office, certifique-se de selecionar o formato CSV simples ou CSV (MS-DOS) . Não use CSV (Macintosh) como tipo de salvamento.

Minha versão preferida da EOL seria LF (Unix / Linux / Apple), mas não creio que o MS Office ofereça a opção de salvar neste formato.


4
O MS DOS Comma Separated não funcionou para mim (mesmo erro), mas o Windows Comma Separated.
tmthyjames

3
Se você estiver em um Mac, esta é absolutamente a resposta correta.
HashHazard

Eu recebo o mesmo problema no OS X. Encontro-me tendo que criar um novo arquivo CSV. Simplesmente salvar o atual como formato CSV simples ou CSV (MS-DOS) não corrige o problema.
Pyderman

1
No OS X, o Windows Comma Separated csv funcionou, o MS DOS Comma Separated não.
user2348114

31

No Mac OS X, salve o arquivo CSV no formato "Windows Comma Separated (.csv)".


1
obrigado, esse foi o ingrediente necessário, pois estou usando o Mac com o MS office.
travelingbones

18

Se isso acontecer com você no mac (como aconteceu comigo):

  1. Salve o arquivo como CSV (MS-DOS Comma-Separated)
  2. Execute o seguinte script

    with open(csv_filename, 'rU') as csvfile:
        csvreader = csv.reader(csvfile)
        for row in csvreader:
            print ', '.join(row)

2
Você acabou de abalar o meu mundo.
kta

5

Tente executar dos2unixprimeiro os arquivos importados do Windows


Não é realmente uma opção. Eu preciso permitir que o usuário faça o upload do csv no Windows e no Macs sem nenhuma modificação especial. A importação foi salva do Excel (Windows) como um CSV, então talvez exista algo extra que precise ser feito no Python para lê-los?
GrantU

@GrantU Você está se referindo ao Mac OS X 10.0 ou posterior, não ao Mac OS 9 ou anterior, correto? Entre 9 e 10, o Mac OS passou de \x0dfinais de linha (ProDOS) para finais de linha \x0a(UNIX).
Damian Yerrick 28/11

2

Este é um erro que eu enfrentei. Eu salvei o arquivo .csv no MAC OSX.

Ao salvar, salve-o como "Valores separados por vírgula do Windows (.csv)", que resolveu o problema.


1

Isso funcionou para mim no OSX.

# allow variable to opened as files
from io import StringIO

# library to map other strange (accented) characters back into UTF-8
from unidecode import unidecode

# cleanse input file with Windows formating to plain UTF-8 string
with open(filename, 'rb') as fID:
    uncleansedBytes = fID.read()
    # decode the file using the correct encoding scheme
    # (probably this old windows one) 
    uncleansedText = uncleansedBytes.decode('Windows-1252')

    # replace carriage-returns with new-lines
    cleansedText = uncleansedText.replace('\r', '\n')

    # map any other non UTF-8 characters into UTF-8
    asciiText = unidecode(cleansedText)

# read each line of the csv file and store as an array of dicts, 
# use first line as field names for each dict. 
reader = csv.DictReader(StringIO(cleansedText))
for line_entry in reader:
    # do something with your read data 

1

Eu sei que isso foi respondido por um bom tempo, mas não resolvi meu problema. Estou usando o DictReader e o StringIO na minha leitura de csv devido a outras complicações. Consegui resolver o problema mais simplesmente substituindo explicitamente delimitadores:

with urllib.request.urlopen(q) as response:
    raw_data = response.read()
    encoding = response.info().get_content_charset('utf8') 
    data = raw_data.decode(encoding)
    if '\r\n' not in data:
        # proably a windows delimited thing...try to update it
        data = data.replace('\r', '\r\n')

Pode não ser razoável para enormes arquivos CSV, mas funcionou bem no meu caso de uso.


Isso resolveu o meu problema, Graças Olhe! Aqui
AOF

0

Solução alternativa e rápida: enfrentei o mesmo erro. Reabri o arquivo csv "estranho" no GNUMERIC na minha máquina lubuntu e exportei o arquivo como arquivo csv. Isso corrigiu o problema.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.