从zip打开文件而不用Python提取它?

时间:2018-03-28 11:05:42

标签: python zipfile

我正在开发一个脚本,该脚本使用tje请求库从URL中获取zip文件。该zip文件包含csv文件。我试图在不保存的情况下读取该csv文件。但在解析它时却给了我这个错误:_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

import csv
import requests
from io import BytesIO, StringIO
from zipfile import ZipFile

response = requests.get(url)
zip_file = ZipFile(BytesIO(response.content))
files = zip_file.namelist()
with zip_file.open(files[0]) as csvfile:
    csvreader = csv.reader(csvfile)

    # _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

    for row in csvreader:
        print(row)

2 个答案:

答案 0 :(得分:3)

试试这个:

import pandas as pd
import requests
from io import BytesIO, StringIO
from zipfile import ZipFile

response = requests.get(url)
zip_file = ZipFile(BytesIO(response.content))
files = zip_file.namelist()
with zip_file.open(files[0]) as csvfile:   
    print(pd.read_csv(csvfile, encoding='utf8', sep=","))

答案 1 :(得分:0)

@ Aran-Fey提到:

import zipfile
import csv
import io

with open('/path/to/archive.zip', 'r') as f:
    with zipfile.ZipFile(f) as zf:
        csv_filename = zf.namelist()[0]  # see namelist() for the list of files in the archive
        with zf.open(csv_filename) as csv_f:
            csv_f_as_text = io.TextIOWrapper(csv_f)
            reader = csv.reader(csv_f_as_text)

csv.reader(和csv.DictReader)需要以文本模式打开的类似文件的对象。通常,仅以open(...)模式'r'rt来处理文件就不会有问题,如Python 3 docs所说,文本模式是默认设置:“默认模式为'r'(可读取文本, “ rt”)的同义词”。但是,如果您在open上将ZipFileZipFile.open() requires mode "r" or "w"一起使用,则会看到错误: with zf.open(csv_filename, 'rt') as csv_f: --------------------------------------------------------------------------- ValueError Traceback (most recent call last) ... ValueError: open() requires mode "r" or "w"

io.TextIOWrapper

这就是{{1}}的意思-将字节流包装为文本可读取,并即时对其进行解码。

相关问题