因为我需要读取的一些CSV文件非常大(多GB),所以我试图实现一个进度条,当从带有pandas的URL阅读CSV文件时,该进度条指示从总字节中读取的字节数。
我正在尝试实现这样的东西:
from tqdm import tqdm
import requests
from sodapy import Socrata
import contextlib
import urllib
import pandas as pd
url = "https://public.tableau.com/views/PPBOpenDataDownloads/UseOfForce-All.csv?:showVizHome=no"
response = requests.get(url, params=None, stream=True)
response.raise_for_status()
total_size = int(response.headers.get('Content-Length', 0))
block_size = 1000
df = []
last_position = 0
cur_position = 1
with tqdm(desc=url, total=total_size,
unit='iB',
unit_scale=True,
unit_divisor=1024
) as bar:
with contextlib.closing(urllib.request.urlopen(url=url)) as rd:
# Create TextFileReader
reader = pd.read_csv(rd, chunksize=block_size)
for chunk in reader:
df.append(chunk)
# Here I would like to calculate the current file position: cur_position
bar.update(cur_position - last_position)
last_position = cur_position
有没有办法从pandas TextFileReader中获取文件位置?也许是与C++中的ftell等价的TextFileReader?
2条答案
按热度按时间rlcwz9us1#
没有经过彻底的测试,但是你可以用
read()
方法实现自定义类,你可以从requests
响应中逐行读取并更新tqdm
条:图纸:
xuo3flqw2#
这里是另一个例子,用于执行Pandas分块CSV阅读器,并在缺少总长度或记录编号的情况下显示一些进度信息。
tqdm(total=)
参数来更改,您可以获得自动估计,但总数必须在Pandas reader之外获得Full code here