簡體   English   中英

Pandas read_csv() 有條件地跳過 header 行

[英]Pandas read_csv() conditionally skipping header row

我正在嘗試讀取csv文件,但我的 csv 文件不同。 有些有不同的格式,有些有其他的。 我正在嘗試添加控件,這樣我就不需要編輯我的代碼或我的輸入文件。

我的問題是,其中一些 csv 文件在列標題上方有一行字符串。 一個例子:

Created on 12-11-2018,CryptoDataDownload.com
Date,Symbol,Open,High,Low,Close,Volume From,Volume To
2018-12-11 11-AM,ADABTC,8.6e-06,8.61e-06,8.55e-06,8.57e-06,301141.7,2.59
2018-12-11 10-AM,ADABTC,8.69e-06,8.72e-06,8.6e-06,8.6e-06,236949.63,2.05

如果我導入它,分隔符將使用第一行並將文件分成兩列,如Created on 12-11-2018CryptoDataDownload.com

這就是df.head()的樣子:

                        Created on 12-11-2018 CryptoDataDownload.com
Date             Symbol Open     High     Low      Close              Volume From                          Volume To
2018-12-11 11-AM ADABTC 8.6e-06  8.61e-06 8.55e-06 8.57e-06              301141.7                               2.59
2018-12-11 10-AM ADABTC 8.69e-06 8.72e-06 8.6e-06  8.6e-06              236949.63                               2.05
2018-12-11 09-AM ADABTC 8.7e-06  8.7e-06  8.62e-06 8.69e-06             509311.39                               4.41
2018-12-11 08-AM ADABTC 8.69e-06 8.7e-06  8.63e-06 8.7e-06              111367.34                             0.9656

我想檢查這個文件是否有這一行,如果有,就跳過它。

我怎樣才能做到這一點?

如果CSV文件中的標題遵循類似的模式,您可以執行一些簡單的操作,例如在確定是否跳過第一行之前嗅出第一行。

filename = '/path/to/file.csv'
skiprows = int('Created in' in next(open(filename)))
df = pd.read_csv(filename, skiprows=skiprows)

好的做法是使用上下文管理器,所以你也可以這樣做:

filename = '/path/to/file.csv'
skiprows = 0
with open(filename, 'r+') as f:
    for line in f:
        if line.startswith('Created '):
            skiprows = 1
        break
df = pd.read_csv(filename, skiprows=skiprows)

在pandas read_csv命令中使用'comment'參數時,可以跳過以特定字符開頭的行。 在您的情況下,您可以使用以下代碼跳過以“C”開頭的行:

filename = '/path/to/file.csv'
pd.read_csv(filename, comment = "C")

這對我有用:

import os
import requests

CSV_URL = '...'

with open(os.path.split(CSV_URL)[1], 'wb') as f, requests.get(CSV_URL, stream=True) as r:
    lines = 0
    for line in r.iter_lines():
        if lines == 0:
            lines += 1
        else:
            f.write(line+'\n'.encode())

對於您的情況:

import os
import requests

CSV_URL = '...'

with open(os.path.split(CSV_URL)[1], 'wb') as f, requests.get(CSV_URL, stream=True) as r:
    for line in r.iter_lines():
        if line[:11] != 'Created on ':
            f.write(line+'\n'.encode())

改編自: stackoverflow

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM