我正在开发一个脚本,该脚本使用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)
答案 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
上将ZipFile
与ZipFile.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}}的意思-将字节流包装为文本可读取,并即时对其进行解码。