在未引用的字段错误中看到 CSV 换行符

Posted

技术标签:

【中文标题】在未引用的字段错误中看到 CSV 换行符【英文标题】:CSV new-line character seen in unquoted field error 【发布时间】:2013-06-23 07:55:46 【问题描述】:

以下代码一直有效,直到今天我从 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 下面的回答解决了我的类似问题。 ***.com/a/17315726/3131666 【参考方案1】:

查看 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() 当我尝试拆分行版本时(非常酷,谢谢),我强制转换为 Unicode:需要字符串或缓冲区,找到 S3BotoStorageFile 哪个选项最终奏效了?顺便说一句,您正在读取文件两次:get_row_count()get_column_count() - 考虑读取__init__ 中的文件并记住self.data 中的data,然后在其他方法中使用它。 +1 for splitlines() 避免在 OSX 上使用不同的格式选项。希望它也适用于其他平台... 很好的答案。但是,使用 - "dialect=csv.excel_tab" 会在与 csv.DictReader 一起使用时搞砸输出。不过,只有“rU”选项才能神奇地发挥作用【参考方案2】:

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

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

【讨论】:

MS DOS 逗号分隔对我不起作用(同样的错误),但 Windows 逗号分隔。 如果您使用的是 Mac,这绝对是正确答案。 我在 OS X 上遇到了同样的问题。我发现自己必须制作一个新的 CSV 文件。简单地将当前保存为纯 CSV 格式或 CSV (MS-DOS) 并不能解决问题。 在 OS X 上,Windows 逗号分隔的 csv 工作,MS DOS 逗号分隔没有。【参考方案3】:

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

【讨论】:

谢谢,这是需要的成分,因为我使用的是带有 MS Office 的 Mac。【参考方案4】:

如果您在 mac 上遇到这种情况(就像发生在我身上一样):

    将文件另存为CSV (MS-DOS Comma-Separated)

    运行以下脚本

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

【讨论】:

【参考方案5】:

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

【讨论】:

没有真正的选项我需要允许用户从 Windows 和 Mac 上传 csv 而无需任何特殊修改。导入从 Excel (Windows) 保存为 CSV,所以可能需要在 Python 中完成一些额外的操作才能读取这些内容? @GrantU 您指的是 Mac OS X 10.0 或更高版本,而不是 Mac OS 9 或更早版本,对吗?在 9 和 10 之间,Mac OS 从 \x0d (ProDOS) 行尾切换到 \x0a (UNIX) 行尾。【参考方案6】:

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

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

【讨论】:

【参考方案7】:

这在 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 

【讨论】:

【参考方案8】:

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

【讨论】:

解决了我的问题,谢谢!看here【参考方案9】:

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

【讨论】:

以上是关于在未引用的字段错误中看到 CSV 换行符的主要内容,如果未能解决你的问题,请参考以下文章

奇怪错误 - CS0012:类型x在未引用的程序集中定义

打印 CSV 的前 N ​​行,其中引用的字段可以包含换行符

在构建我的 c# 项目时,出现“在未引用的程序集中定义”错误,如何解决?

csv文件

在未定义/空子文档 ObjectId 字段上设置值会产生 Cast to ObjectId 错误

将数据从 SQL Server Express 导出到 CSV(需要引用和转义)