2013-06-05 77 views
0

(本问题是关系到this oneCSV读者:行包含NULL字节

我读解析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

您不需要将输入封装在'StringIO'对象中;只要通过任何迭代;例如,'text.splitlines(True)'会很好。 –

+0

您能否给我们提供一个能够重现问题的最小样本“文本”值? –

+0

不会'numpy.loadtxt'为你的情况工作吗? –

回答

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

csv模块在从Unicode编码文件读取数据时出现问题。当我将代码粘贴到Python解释器并用手动输入的文本字符串调用它时,它的工作方式起作用,所以如果您尝试将文件保存为ANSI/ASCII格式,或者在将文件加载到内存时将其转换为ASCII,它应该可以正常工作。

相关问题