使用 pylab (matplotlib) 读取 csv 数据时出现 python EOF 错误



我正在尝试使用 matplotlib(在 Python 2.6 中)从 csv 文件中绘制数据,但是我在从 csv 读取数据时遇到了一些问题:

import pylab
# works fine - manually output data for debug
with open(datafile,'rb') as f:
    for row in f:
        print row
# fails - "no data" error
a = pylab.loadtxt(datafile, comments='#', delimiter=',', skiprows=1)

手动读取数据工作正常(with open部分)。pylab.loadtxt代码引发错误:

raise IOError('End-of-file reached before encountering data.')
    IOError: End-of-file reached before encountering data.

我最初认为这是数据文件中换行符的问题(即可能所有内容都在一行上并且被skiprows=1跳过),但我通过在记事本中手动创建测试文件并看到相同的错误来排除这一点。以下是测试文件中的数据:

time,temperature
193,23.1
4040,23.2
4357,23.3
4423,23.4

我还尝试删除标题行并省略代码的skiplines=1部分。这也失败了,但出现了不同的错误:

ValueError: invalid literal for float(): 23.1

至少这表明它"看到"了数字数据。

我在这里做错了什么?

在 Windows 上,行分隔符是 rn 。在Unix上,行分隔符是n。您的数据文件未遵循这些约定中的任何一个,这就是pylab(err,numpy)无法正确解析文件的原因。

要修复文件,请执行以下操作:

import os
outfile = datafile+'-fixed'
with open(datafile, 'rb') as f, open(outfile, 'wb') as g:
    content = f.read()
    g.write(content.replace('r', 'rn'))
os.rename(outfile, datafile)

正如@unutbu所说,问题很可能出在换行符上r应该为 Windows rn

如果您不想创建新文件,可以使用StringIO

from StringIO import StringIO
output = StringIO.StringIO()
with open(datafile, 'rb') as f:
    output.write( f.read().replace('r', 'rn') )
import pylab
a = pylab.loadtxt(output, comments='#', delimiter=',', skiprows=1)    

最新更新