让pandas.read_csv()在csv文件的开头忽略垃圾?

时间:2016-01-21 18:56:17

标签: python csv pandas

我的csv文件开头有一些垃圾,导致我无法按名称选择数据框的第一列。

示例:

In[1]: df = pd.read_csv('file:inputdata.csv', usecols=[0], nrows=1)

In[2]: df
Out[2]:
        TAB
0  10-LV_Non

In[3]: df['TAB']
Out[3]: <snip> KeyError: 'TAB'

我通过open():

读取文件找到了垃圾
In[4]: with open('inputdata.csv', 'rb') as f:
           print(f.read(7))
Out[4]: b'\xef\xbb\xbfTAB,'

编辑:'\xef\xbb\xbf'是三个字节的垃圾。 'TAB'是第一列的名称。

有没有办法让pandas.read_csv()在csv文件的开头忽略像这样(如果存在)的junks?

注意:csv文件是从专有系统导出的,因此无法控制其格式。

更新:这是我的解决方案,基于MikeMüller的回答:

with open('inputdata.csv', 'r') as f:
    # Skip past any bytes that aren't text
    while re.match('[a-zA-Z0-9_]', f.read(1)) is None:
        pass
    # Seek back one byte
    f.seek(f.tell()-1)
    # Read the file
    df = pd.read_csv(f, usecols=['TAB'])

2 个答案:

答案 0 :(得分:2)

我不清楚“垃圾”的格式究竟是什么,但有很多选项可供使用。

pandas.read_csv需要filepath_or_buffer

  

filepath_or_buffer:字符串或文件句柄/ StringIO

如果您open一个File object,请阅读垃圾邮件,然后将File对象传递给read_csv,那就应该没问题了。

skiprows个参数会跳过行:

  

skiprows:list-like或integer,默认无

因此你可以跳过垃圾的行。

答案 1 :(得分:1)

这样的事情可行:

with open('inputdata.csv', 'rb') as f:
    if f.read(7) != b'\xef\xbb\xbfTAB,':
        f.seek(0)
    df = pd.read_csv(f, usecols=[0], nrows=1)

只需读取前七个字节。如果是好的,即不等于你不想要的字节,用seek(0)返回文件的开头,否则开始读取位置7字节,跳过有问题的字节。