122

以下代码一直有效,直到今天我从 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)
4

9 回答 9

185

查看 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
于 2013-06-26T09:09:41.467 回答
55

我意识到这是一个旧帖子,但我遇到了同样的问题,没有看到正确的答案,所以我会试一试

蟒蛇错误:

_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 不提供以这种格式保存的选项。

于 2015-01-11T18:44:19.230 回答
32

对于 Mac OS X,将 CSV 文件保存为“Windows 逗号分隔 (.csv)”格式。

于 2015-05-21T17:33:27.153 回答
19

如果您在 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)
    
于 2015-09-28T15:53:53.333 回答
5

尝试先dos2unix在您的 Windows 导入文件上运行

于 2013-06-26T09:00:34.623 回答
2

这是我遇到的一个错误。我在 MAC OSX 中保存了 .csv 文件。

保存时,将其另存为“Windows 逗号分隔值 (.csv)”即可解决问题。

于 2017-03-08T01:19:07.817 回答
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 
于 2016-10-28T15:50:25.583 回答
1

我知道这已经回答了很长一段时间,但没有解决我的问题。由于其他一些并发症,我正在使用 DictReader 和 StringIO 读取 csv。通过显式替换分隔符,我能够更简单地解决问题:

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 文件可能不合理,但对我的用例来说效果很好。

于 2018-12-01T00:40:03.513 回答
0

替代且快速的解决方案:我遇到了同样的错误。我在我的 lubuntu 机器上重新打开了 GNUMERIC 中的“怪异” csv 文件,并将该文件导出为 csv 文件。这纠正了这个问题。

于 2018-12-26T19:04:03.103 回答