2016-01-21 88 views
1

我在我的csv文件的開頭有一些垃圾,它阻止我按名稱選擇我的數據框的第一列。讓pandas.read_csv()在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' 

我發現垃圾通過讀取文件具有開放():

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文件開始時忽略這樣的垃圾箱(如果存在)?

注意csv文件是從專有系統導出的,所以我無法控制它們的格式。

更新:這是我的解決方案的基礎上,邁克穆勒的回答是:

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

這是我不清楚究竟是什麼「垃圾」的格式,但也有一些選項來使用。


pandas.read_csv需要​​

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

因此,如果您open一個File object,閱讀過去的垃圾,然後通過File對象到read_csv,應該可以。


skiprows參數跳過行:

skiprows:列表狀或整數,默認無

因此,你可以跳過可能垃圾的行(或多個)。

+0

skiprows是要走的路 – latorrefabian

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) 

剛看完第一個7個字節。如果是好的,即不等於你不想要的字節,則返回seek(0)的文件開頭,否則從位置7字節處開始讀取,跳過有問題的字節。