Python ';应用程序/八位字节流';而不是应用程序/csv?

Python ';应用程序/八位字节流';而不是应用程序/csv?,python,csv,request-headers,Python,Csv,Request Headers,我对Python还很陌生。我想确认数据集的类型(下面代码中的URL)确实是csv文件。然而,当通过标题进行检查时,我得到的是“application/octet stream”,而不是“application/csv”。 我假设我在读取数据时以错误的方式定义了某些内容,但我不知道是什么。 谢谢你的帮助 import requests url="https://opendata.ecdc.europa.eu/covid19/casedistribution/csv/data.csv&qu

我对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
标题应该指示响应主体是什么,但是您无法强制服务器将其设置为您期望的值。有些服务器配置不好,无法正常运行


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

更重要的是,每种内容不一定都有一种真正的类型,只有或多或少广泛商定的约定。对于CSV,常见的是
text/CSV

因此,如果您确定内容是什么,可以忽略内容类型标题

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)
在没有任何进一步信息的情况下,以二进制模式写入文件是一个好主意,因为这样可以保持原始字节的原样


为了将其转换为字符串,需要使用特定的编码对其进行解码。由于这里的内容类型没有给出任何指示(它可以说
内容类型:text/csv;charset=XYZ
),因此对来自互联网的数据最好的第一个假设是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)

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

应用程序/八位字节流
是从服务器发送的,您无法更改任何内容。通常,
octet-stream
用于强制浏览器下载文件。请参阅@mauricemeyer这不是我希望的答案哈哈!谢谢:)