인용되지 않은 필드 오류에 CSV 개행 문자가 표시됨


121

다음 코드는 오늘까지 Windows 컴퓨터에서 가져 왔을 때이 오류가 발생했습니다.

인용되지 않은 필드에 개행 문자가 표시됩니다. 범용 개행 모드로 파일을 열어야합니까?

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]

이 문제를 어떻게 해결할 수 있습니까?

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)

아래의 rectummelancolique의 대답은 비슷한 문제를 해결 한 것입니다. stackoverflow.com/a/17315726/3131666
kmantel 2015 년

답변:


181

csv 파일 자체를 보는 것이 좋지만이 방법이 효과가있을 수 있습니다. 시도해보고 교체하십시오.

file_read = csv.reader(self.file)

와:

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

또는 다음과 같이 파일을 열고에 universal newline mode전달합니다 csv.reader.

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

또는 다음 splitlines()과 같이 사용 하십시오.

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

이제 동일한 오류가 발생하지만, on line starting upload.num_records = csvobject.get_row_count () now
GrantU

1
그리고 분할 선 버전을 시도 할 때 (매우 멋진 감사합니다) 유니 코드로 강제 변환됩니다. 문자열 또는 버퍼가 필요합니다. S3BotoStorageFile을 찾았습니다.
GrantU

4
결국 어떤 옵션이 효과가 있었습니까? BTW, 당신은 두 번 파일을 읽고 :에 get_row_count()와에 get_column_count()- 고려에서 파일을 읽는 __init__기억 data에서 self.data다음 다른 방법으로 사용.
alecxe 2013-06-26

OSX에서 다른 포맷 옵션을 사용하는 것을 방지하는 splitlines ()의 경우 +1. 너무 다른 플랫폼에서 작동 그것은 희망 ...
python1981

좋은 대답입니다. 그러나- "dialect = csv.excel_tab"을 사용하면 csv.DictReader와 함께 사용할 때 출력이 망가집니다. 하지만 'rU'옵션 만 마법처럼 작동합니다
Murphy

52

나는 이것이 오래된 게시물이라는 것을 알고 있지만 동일한 문제가 발생하여 정답이 보이지 않으므로 시도해 볼 것입니다.

Python 오류 :

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

Macintosh (OS X 이전 형식) CSV 파일을 읽으려고 할 때 발생합니다. 행 끝에 CR을 사용하는 텍스트 파일입니다. MS Office를 사용하는 경우 일반 CSV 형식 또는 CSV (MS-DOS) 를 선택해야합니다 . CSV (Macintosh)를 다른 이름 으로 저장 유형으로 사용하지 마십시오 .

내가 선호하는 EOL 버전은 LF (Unix / Linux / Apple)이지만 MS Office가이 형식으로 저장하는 옵션을 제공하지 않는다고 생각합니다.


4
MS DOS Comma Separated는 나에게 작동하지 않았지만 (동일한 오류) Windows Comma Separated.
tmthyjames

3
Mac을 사용하는 경우 이것은 절대적으로 정답입니다.
HashHazard 2015-06-30

OS X에서 동일한 문제가 발생합니다. 새 CSV 파일을 만들어야합니다. 현재를 일반 CSV 형식 또는 CSV (MS-DOS)로 저장하는 것만으로는 문제가 해결되지 않습니다.
Pyderman

1
OS X에서는 Windows Comma Separated csv가 작동했지만 MS DOS Comma Separated는 작동하지 않았습니다.
user2348114

31

Mac OS X의 경우 CSV 파일을 "Windows Comma Separated (.csv)"형식으로 저장합니다.


1
감사합니다. 제가 MS 오피스가있는 Mac을 사용하고 있기 때문에 그것이 필요한 성분이었습니다.
travellingbones

18

Mac에서 이런 일이 발생하면 (나에게했던 것처럼) :

  1. 파일을 다른 이름으로 저장 CSV (MS-DOS Comma-Separated)
  2. 다음 스크립트를 실행하십시오.

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

2
당신은 내 세상을 흔들 었습니다.
kta

5

dos2unixWindows에서 가져온 파일을 먼저 실행 하십시오.


사용자가 특별한 수정없이 Windows와 Mac 모두에서 csv를 업로드 할 수 있도록 허용해야하는 옵션이 없습니다. 가져 오기는 Excel (Windows)에서 CSV로 저장되었으므로 Python에서이를 읽으려면 추가로 수행해야하는 작업이 있습니까?
GrantU

@GrantU Mac OS 9 이하가 아닌 Mac OS X 10.0 이상을 언급하고 있습니다. 맞습니까? 9에서 10 사이에 Mac OS는 \x0d(ProDOS) 줄 끝에서 \x0a(UNIX) 줄 끝으로 전환되었습니다.
Damian Yerrick

2

이것은 내가 직면 한 오류입니다. .csv 파일을 MAC OSX에 저장했습니다.

저장하는 동안 문제를 해결 한 "Windows 쉼표로 구분 된 값 (.csv)"으로 저장합니다.


1

이것은 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

나는 이것이 꽤 오랫동안 대답되었지만 내 문제를 해결하지 못했다는 것을 알고 있습니다. 다른 합병증으로 인해 내 csv 읽기에 DictReader 및 StringIO를 사용하고 있습니다. 구분 기호를 명시 적으로 대체하여 문제를 더 간단하게 해결할 수있었습니다.

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')

거대한 CSV 파일에는 적절하지 않을 수 있지만 내 사용 사례에는 잘 작동했습니다.


즉, 덕분에 내 문제를 해결 봐! 여기
AOF

0

대안적이고 빠른 솔루션 : 동일한 오류가 발생했습니다. lubuntu 컴퓨터의 GNUMERIC에서 "wierd"csv 파일을 다시 열고 파일을 csv 파일로 내보냈습니다. 이것은 문제를 해결했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.