我的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'])
答案 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字节,跳过有问题的字节。