3 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個贊
您可以傳遞給 ,以避免立即獲取整個結(jié)果。在這種情況下,您可以通過 訪問偽文件對象,您可以基于此構(gòu)建CSV閱讀器(或者,響應(yīng)對象具有和方法,但我不知道將其提供給CSV解析器有多容易)。stream=True
requests.get
response.raw
iter_content
iter_lines
然而,雖然stdlib的模塊只是生成一系列列表或字典,因此很容易懶惰,但pandas返回一個不懶惰的數(shù)據(jù)幀,所以你需要指定一些特殊參數(shù),然后你得到每個塊的數(shù)據(jù)幀或它看起來像什么。csv

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個贊
無論如何,該調(diào)用將為您提供整個文件。您需要實(shí)現(xiàn)自己的HTTP代碼,直至套接字級別,以便能夠在內(nèi)容進(jìn)入時以普通的HTTP Get方法進(jìn)行處理。requests.get
獲取部分結(jié)果并對下載進(jìn)行切片的唯一方法是添加HTTP“范圍”請求標(biāo)頭,如果服務(wù)器提供文件支持。(可以讓您設(shè)置這些標(biāo)頭)。requests
輸入請求高級用法:
好消息是,請求可以在后臺為您做到這一點(diǎn) - 您可以在調(diào)用請求時設(shè)置參數(shù),它甚至可以讓您逐行迭代內(nèi)容。請查看該部分的文檔。stream=True
以下是或多或少在引擎蓋下的作用,以便您可以逐行獲取內(nèi)容:requests
它將獲得重新調(diào)整大小的數(shù)據(jù)塊,但肯定不會一次保留一行(想想~80字節(jié)與100.000字節(jié)),因?yàn)榉駝t它需要為每行一個新的HTTP請求,并且每個請求的開銷不是微不足道的,即使通過相同的TCP連接進(jìn)行。
無論如何,由于CSV是一種文本格式,在相應(yīng)地設(shè)置范圍標(biāo)題之前,請求或任何其他軟件都無法知道行的大小,甚至不知道要讀取的“下一個”行的確切大小。
因此,要使此功能起作用,必須使用Python代碼才能:
接受對 CSV 的“新行”的請求(如果有緩沖文本行),則生成下一行,
否則,為下一個 100KB 左右的 HTTP 請求
將下載的數(shù)據(jù)連接到上次下載行的其余部分
在二進(jìn)制數(shù)據(jù)中的最后一個換行符處拆分下載的數(shù)據(jù),
保存最后一行的其余部分
將二進(jìn)制緩沖區(qū)轉(zhuǎn)換為文本,(您必須在多字節(jié)編碼(如utf-8)中處理多字節(jié)字符邊界 - 但是在換行符處剪切可能會節(jié)省您)
生成下一個文本行

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個贊
根據(jù)Masklinn的答案,我的代碼現(xiàn)在看起來像這樣:
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
添加回答
舉報(bào)