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年

Answers:


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

现在这会产生相同的错误,但现在开始在线开始upload.num_records = csvobject.get_row_count()
GrantU 2013年

1
当我尝试分割线版本时(非常酷,谢谢),我被迫使用Unicode:需要字符串或缓冲区,发现了
S3BotoStorageFile

4
最终有什么选择起作用?顺便说一句,您正在读取文件两次:in get_row_count()和in- get_column_count()考虑将文件读入__init__并记住datain self.data,然后以其他方法使用它。
alecxe 2013年

+1为splitlines()避免了在OSX上乱七八糟的格式化选项。希望它也可以在其他平台上工作...
python1981 '17

好答案。但是,如果使用-“ 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逗号分隔对我不起作用(相同错误),但Windows逗号分隔。
tmthyjames,2015年

3
如果您使用的是Mac,那绝对是正确的答案。
HashHazard

我在OS X上遇到了同样的问题。我发现自己必须制作一个新的CSV文件。仅将当前格式保存为纯CSV格式或CSV(MS-DOS)并不能解决问题。
皮德曼

1
在OS X上,Windows Comma Separated csv可以工作,而MS DOS Comma Separated则不能。
user2348114

31

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


1
谢谢,这是必需的成分,因为我使用的是带MS Office的Mac。
travelingbones

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

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


没有真正的选择,我需要允许用户无需任何特殊修改即可从Windows和Mac上载csv。导入是从Excel(Windows)中保存为CSV,所以也许需要做一些额外的事情才能在Python中读取这些内容?
GrantU 2013年

@GrantU您指的是Mac OS X 10.0或更高版本,而不是Mac OS 9或更早版本,对吗?在9到10之间,Mac OS从\x0d(ProDOS)线尾切换到\x0a(UNIX)线尾。
Damian Yerrick '16

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

我知道这个问题已经回答了很长时间,但并不能解决我的问题。由于其他一些复杂性,我正在使用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文件来说可能并不合理,但对于我的用例来说效果很好。


这解决了我的问题,谢谢你看!这里
AOF

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.