“应用程序/八位字节流”而不是应用程序/csv?

bhmjp9jg  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(157)

我是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'] )
rur96b6h

rur96b6h1#

我假设我在阅读数据时以错误的方式定义了某些内容
不,你没有。Content-Type头被 * 假定 * 指示响应主体是什么,但是你不能强迫服务器将其设置为你期望的值。一些服务器只是配置不好,不沿着。
application/octet-stream是所有内容类型中最通用的--它只会告诉你“这是一堆字节,玩得开心”。
此外,每种内容不一定都有一个True Type,只有或多或少被广泛认可的约定,对于CSV来说,一个常见的约定是text/csv
因此,如果您确定内容是什么,请随意忽略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),所以对于来自互联网的数据,最好的第一个假设是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)

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

相关问题