(此问题与this one)
有关我正在阅读解析csv内容,该内容先前已加载到内存中:
def ReadTxtIntoColumns(txt, columns):
rows = []
print txt
print txt.find('\x00')
print txt.count('\x00')
f = StringIO(txt)
try:
reader = csv.reader(f, delimiter=' ', skipinitialspace=True)
for row in reader:
# Merge all extra columns
if len(row) >= columns:
rest = ' '.join(row[columns-1:])
del row[columns-1:]
row.append(rest)
# And now set missing columns to None
for i in range (len (row), columns):
row.append(None)
rows.append(row)
except csv.Error, e:
log.error('ReadTxtIntoColumns > Problems reading csv from string > line %d: %s', reader.line_num, e)
finally:
f.close()
return rows
输入数据是我手写的(一个简单的文本文件,空格分隔)。我的输入数据中根本没有'\ x00',但csv抱怨它:
ReadTxtIntoColumns > Problems reading csv from string > line 1: line contains NULL byte
错误信息的含义是什么?
这是我的简化输入数据,我已经验证仍然会导致同样的问题:
#COMMAND USER DIRECTORY SAFE COMMAND
uname - - FALSE uname -a
sleep - - FALSE sleep 100
答案 0 :(得分:3)
csv
module包含以下警告:
此版本的csv模块不支持Unicode输入。此外,目前有一些关于ASCII NUL字符的问题。因此,所有输入应为UTF-8或可打印的ASCII以确保安全;请参阅示例部分中的示例。
StringIO.StringIO
对象支持unicode,但如果您使用的是cStringIO
模块,则cStringIO.StringIO
不会,并且可能会导致更多问题。
如果您的数据仅为ASCII,请先编码txt
:
txt = txt.encode()
2.7.3中可能会添加一些修复程序,使问题不那么明显。
答案 1 :(得分:1)
csv模块在从Unicode编码文件中读取数据时出现问题。当我将它粘贴到python解释器并使用手动输入的文本字符串调用它时,您的代码就可以工作了,所以如果您尝试以ANSI / ASCII格式保存文件,或者在将文件加载到内存时将其转换为ASCII,它应该可以工作。