“application/octet-stream”而不是 application/csv?

2024-01-03

我对 Python 还很陌生。我想确认数据集的类型(下面代码中的URL)确实是一个csv文件。但是,当通过标题检查时,我得到“application/octet-stream”而不是“application/csv”。

我假设我在读取数据时以错误的方式定义了某些内容,但我不知道是什么。

import requests
url="https://opendata.ecdc.europa.eu/covid19/casedistribution/csv/data.csv"
d1 = requests.get( url )

filePath = 'data/data_notebook-1_covid-new.csv'
with open(filePath, "wb") as f: 
    f.write(d1.content)

## data type via headers #PROBLEM
import requests
headerDict=d1.headers

#accessing content-type header
if "Content-Type" in headerDict:
    print("Content-Type:")
    print( headerDict['Content-Type'] )

我假设我在读取数据时以错误的方式定义了某些内容

不,你没有。这Content-Type标头是supposed来指示响应正文是什么,但是您无法强制服务器将其设置为您期望的值。有些服务器只是配置不当,无法正常运行。

application/octet-stream是其中最通用的内容类型 - 它只为您提供“这是一堆字节,玩得开心”之外的更多信息。

更重要的是,每种内容不一定有一种真实类型,只有或多或少广泛认可的惯例。对于 CSV,常见的一种是text/csv.

So if you're确定内容是什么,请随意忽略 Content-Type 标头。

import requests

url = "https://opendata.ecdc.europa.eu/covid19/casedistribution/csv/data.csv"
response = requests.get(url)

filePath = 'data/data_notebook-1_covid-new.csv'
with open(filePath, "wb") as f: 
    f.write(response.content)

在没有任何进一步信息的情况下,以二进制模式写入文件是一个好主意,因为这将完全按原样保留原始字节。


为了将其转换为字符串,需要使用某种编码对其进行解码。由于 Content-Type 在这里没有给出任何指示(它可以说Content-Type: text/csv; charset=XYZ),来自 Internet 的数据的最佳第一个假设是 UTF-8:

import csv

filePath = 'data/data_notebook-1_covid-new.csv'
with open(filePath, encoding='utf-8') as f: 
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        print(row)

如果结果是错误的(即存在解码错误或乱码),您可以尝试其他编码,直到找到有效的编码。如果您一开始就以文本模式写入文件,则这是不可能的,因为错误解码造成的任何数据损坏都会进入文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“application/octet-stream”而不是 application/csv? 的相关文章

随机推荐