在未引用的字段错误中看到 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 换行符的主要内容,如果未能解决你的问题,请参考以下文章
打印 CSV 的前 N 行,其中引用的字段可以包含换行符
在构建我的 c# 项目时,出现“在未引用的程序集中定义”错误,如何解决?