第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Python - 通過(guò)代理讀取巨大的在線csv

Python - 通過(guò)代理讀取巨大的在線csv

Qyouu 2022-08-25 16:32:21
我有一個(gè)huuuuuge csv在線,我不想逐行閱讀它,下載它。但此文件位于代理后面。我寫(xiě)了這個(gè)代碼:import requestsimport pandas as pdimport iocafile = 'mycert.crt'proxies = {"http":"http://ipproxy:port", "https":"http://ipproxy:port"}auth = HttpNtlmAuth('Username','Password')url = 'http://myurl/ressources.csv'content = requests.get(url, proxies=proxies, auth=auth, verify=cafile).contentcsv_read = pd.read_csv(io.StringIO(content.decode('utf-8')))pattern = 'mypattern'for row in csv_read:    if row[0] == pattern:        print(row)        break上面的這段代碼有效,但“content = requests.get(...”行需要很多時(shí)間!由于 csv 文件的大小。所以我的問(wèn)題是:是否可以通過(guò)代理逐行讀取在線csv?以最好的方式,我希望閱讀第一行,檢查它是否等于我的模式,如果是=中斷,如果不是=讀取第二行和依此類推。感謝您的幫助
查看完整描述

3 回答

?
慕的地8271018

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊

您可以傳遞給 ,以避免立即獲取整個(gè)結(jié)果。在這種情況下,您可以通過(guò) 訪問(wèn)偽文件對(duì)象,您可以基于此構(gòu)建CSV閱讀器(或者,響應(yīng)對(duì)象具有和方法,但我不知道將其提供給CSV解析器有多容易)。stream=Truerequests.getresponse.rawiter_contentiter_lines

然而,雖然stdlib的模塊只是生成一系列列表或字典,因此很容易懶惰,但pandas返回一個(gè)不懶惰的數(shù)據(jù)幀,所以你需要指定一些特殊參數(shù),然后你得到每個(gè)塊的數(shù)據(jù)幀或它看起來(lái)像什么。csv


查看完整回答
反對(duì) 回復(fù) 2022-08-25
?
紅糖糍粑

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊

無(wú)論如何,該調(diào)用將為您提供整個(gè)文件。您需要實(shí)現(xiàn)自己的HTTP代碼,直至套接字級(jí)別,以便能夠在內(nèi)容進(jìn)入時(shí)以普通的HTTP Get方法進(jìn)行處理。requests.get

獲取部分結(jié)果并對(duì)下載進(jìn)行切片的唯一方法是添加HTTP“范圍”請(qǐng)求標(biāo)頭,如果服務(wù)器提供文件支持。(可以讓您設(shè)置這些標(biāo)頭)。requests

輸入請(qǐng)求高級(jí)用法:

好消息是,請(qǐng)求可以在后臺(tái)為您做到這一點(diǎn) - 您可以在調(diào)用請(qǐng)求時(shí)設(shè)置參數(shù),它甚至可以讓您逐行迭代內(nèi)容。請(qǐng)查看該部分的文檔。stream=True

以下是或多或少在引擎蓋下的作用,以便您可以逐行獲取內(nèi)容:requests

它將獲得重新調(diào)整大小的數(shù)據(jù)塊,但肯定不會(huì)一次保留一行(想想~80字節(jié)與100.000字節(jié)),因?yàn)榉駝t它需要為每行一個(gè)新的HTTP請(qǐng)求,并且每個(gè)請(qǐng)求的開(kāi)銷不是微不足道的,即使通過(guò)相同的TCP連接進(jìn)行。

無(wú)論如何,由于CSV是一種文本格式,在相應(yīng)地設(shè)置范圍標(biāo)題之前,請(qǐng)求或任何其他軟件都無(wú)法知道行的大小,甚至不知道要讀取的“下一個(gè)”行的確切大小。

因此,要使此功能起作用,必須使用Python代碼才能:

  • 接受對(duì) CSV 的“新行”的請(qǐng)求(如果有緩沖文本行),則生成下一行,

  • 否則,為下一個(gè) 100KB 左右的 HTTP 請(qǐng)求

  • 將下載的數(shù)據(jù)連接到上次下載行的其余部分

  • 在二進(jìn)制數(shù)據(jù)中的最后一個(gè)換行符處拆分下載的數(shù)據(jù),

  • 保存最后一行的其余部分

  • 將二進(jìn)制緩沖區(qū)轉(zhuǎn)換為文本,(您必須在多字節(jié)編碼(如utf-8)中處理多字節(jié)字符邊界 - 但是在換行符處剪切可能會(huì)節(jié)省您)

  • 生成下一個(gè)文本行


查看完整回答
反對(duì) 回復(fù) 2022-08-25
?
婷婷同學(xué)_

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊

根據(jù)Masklinn的答案,我的代碼現(xiàn)在看起來(lái)像這樣:


import requests


cafile = 'mycert.crt'

proxies = {"http":"http://ipproxy:port", "https":"http://ipproxy:port"}

auth = HttpNtlmAuth('Username','Password')

url = 'http://myurl/ressources.csv'

pattern = 'mypattern'


r = requests.get(url, stream=True, proxies=proxies, verify=cafile)

if r.encoding is None:

    r.encoding = 'ISO-8859-1'


for line in r.iter_lines(decode_unicode=True):

    if line.split(';')[0] == pattern:

        print(line)

        break


查看完整回答
反對(duì) 回復(fù) 2022-08-25
  • 3 回答
  • 0 關(guān)注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)