[文件(.tar.gz)使用urlib下载并处理,并请求package-python

问题描述 投票:0回答:1

SCOPE:使用哪个库? urllib与请求我试图下载URL上可用的日志文件。 URL托管在aws上,并且还包含文件名。访问该URL后,将提供一个.tar.gz文件进行下载。我需要将此文件下载到我选择的untar目录中,并解压缩以到达其中的json文件,最后解析json文件。在互联网上搜索时,我发现零星的信息遍布整个地方。在这个问题中,我尝试将其合并到一个位置。

django python-3.x python-requests urllib contextmanager
1个回答
0
投票

使用请求库:一个PyPi软件包,在处理高HTTP请求时被认为是高级的。裁判:

  1. https://docs.python.org/3/library/urllib.request.html#module-urllib.request
  2. What are the differences between the urllib, urllib2, urllib3 and requests module?

CODE:

with requests.get(respurl,stream = True) as File:
    # stream = true is required by the iter_content below
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        with open(tmp_file.name,'wb') as fd:
            for chunk in File.iter_content(chunk_size=128):
                fd.write(chunk)

with tarfile.open(tmp_file.name,"r:gz") as tf:
    # To save the extracted file in directory of choice with same name as downloaded file.
    tf.extractall(path)
    # for loop for parsing json inside tar.gz file.
    for tarinfo_member in tf:
        print("tarfilename", tarinfo_member.name, "is", tarinfo_member.size, "bytes in size and is", end="")
        if tarinfo_member.isreg():
            print(" a regular file.")
        elif tarinfo_member.isdir():
            print(" a directory.")
        else:
            print(" something else.")
        if os.path.splitext(tarinfo_member.name)[1] == ".json":
            print("json file name:",os.path.splitext(tarinfo_member.name)[0])
            json_file = tf.extractfile(tarinfo_member)
            # capturing json file to read its contents and further processing.
            content = json_file.read()
            json_file_data = json.loads(content)
            print("Status Code",json_file_data[0]['status_code'])
            print("Response Body",json_file_data[0]['response'])
            # Had to decode content again as it was double encoded.
            print("Errors:",json.loads(json_file_data[0]['response'])['errors'])


将提取的文件保存在所选目录中,其名称与下载的文件。变量“路径”形成如下。

URL示例包含文件名'44301621eb-response.tar.gz'

https://yoursite.com/44301621eb-response.tar.gz?AccessKeyId=your_id&Expires=1575526260&Signature=you_signature

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_NAME = 'your_project_name'
PROJECT_ROOT = os.path.join(BASE_DIR, PROJECT_NAME)
LOG_ROOT = os.path.join(PROJECT_ROOT, 'log')
filename = re.split("([^?]+)(?:.+/)([^#?]+)(\?.*)?", respurl)
# respurl is the url from the where the file will be downloaded 
path = os.path.join(LOG_ROOT,filename[2])

但是,只是为了比较一处,并了解微妙的差异,我也使用urllib实现了相同的代码。

注意,tempfile库的用法略有不同为我工作。我不得不在要求的URLlib中使用shutil库由于差异而无法与shutil库的copyfileobj方法一起使用我们使用urllib和请求获得的响应对象。

with urllib.request.urlopen(respurl) as File:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(File, tmp_file)

with tarfile.open(tmp_file.name,"r:gz") as tf:
    print("Temp tf File:", tf.name)
    tf.extractall(path)
    for tarinfo in tf:
        print("tarfilename", tarinfo.name, "is", tarinfo.size, "bytes in size and is", end="")
        if tarinfo.isreg():
            print(" a regular file.")
        elif tarinfo.isdir():
            print(" a directory.")
        else:
            print(" something else.")
        if os.path.splitext(tarinfo_member.name)[1] == ".json":
            print("json file name:",os.path.splitext(tarinfo_member.name)[0])
            json_file = tf.extractfile(tarinfo_member)
            # capturing json file to read its contents and further processing.
            content = json_file.read()
            json_file_data = json.loads(content)
            print("Status Code",json_file_data[0]['status_code'])
            print("Response Body",json_file_data[0]['response'])
            # Had to decode content again as it was double encoded.
            print("Errors:",json.loads(json_file_data[0]['response'])['errors'])

© www.soinside.com 2019 - 2024. All rights reserved.