Python:CSV直接来自web,导致数据无法使用

Python:CSV直接来自web,导致数据无法使用,python,csv,Python,Csv,我正在Windows上使用Python 3.5 我有一段代码,可以从Links.txt中存储的不同URL下载近100个CSV文件: from urllib import request new_lines = 'None' def download_data(csv_url): response = request.urlopen(csv_url) csv = response.read() csv_str = str(csv) global new_lin

我正在Windows上使用Python 3.5

我有一段代码,可以从
Links.txt
中存储的不同URL下载近100个CSV文件:

from urllib import request

new_lines = 'None'


def download_data(csv_url):
    response = request.urlopen(csv_url)
    csv = response.read()
    csv_str = str(csv)
    global new_lines
    new_lines = csv_str.split("\\n")

with open('Links.txt') as file:
    for line in file:
        URL = line
        file_name = URL[54:].rsplit('.ST', 1)[0]
        download_data(URL)
        save_destination = 'C:\\Download data\\Data\\' + file_name + '.csv'
        fx = open(save_destination, "w")
        for lines in new_lines:
            fx.write(lines+"\n")
        fx.close()
问题是生成的CSV文件总是从
b'
开始,在最后一行数据之后,紧接着是另一行
和两行空行来结束。当我从浏览器查看文件时(在下载之前),我看不到这些字符

当我想要导入和使用数据库中的数据时,这会产生问题。您知道为什么会发生这种情况,以及我如何让代码正确地编写CSV文件吗


显然,我们非常欢迎能够使代码更快/更好或针对代码中的其他缺陷进行调整的提示。

下载\u数据
功能中,您需要将字节字符串csv响应转换为普通字符串。
尝试将
csv\u str=csv(csv)
替换为
csv\u str=csv.decode('utf-8')


这应该正确地解码
response.read()

返回的字节字符串。问题是您的函数返回一个
字节
对象
str()
不会按预期的方式将其转换为字符串。使用
csv\u str=csv.decode()

发生的事情是
urllib
将其流视为字节-任何看起来像
b'…'
的字符串都表示它是字节字符串

通过调用
decode('utf-8')
(如Chedy2149所示)对流进行编码,可以解决当前的问题,这将转换数据的字节

但是,您可以通过将文件直接下载到磁盘来完全消除此问题。您需要下载、拆分文件并将其写入磁盘,但所有这些似乎都是不必要的,因为您的代码最终只是将文件内容写入磁盘,而无需对其进行额外的操作

您可以直接使用并下载到文件

下面是一个根据代码修改的示例

import urllib.request

def download_data(url, file_to_save):
    filename, rsp = urllib.request.urlretrieve(url, file_to_save)
    # Assuming everything worked, the file has been downloaded to file_to_save

with open('Links.txt') as file:
    for line in file:
        url = line.rstrip() # adding this here to remove extraneous '\n' from string
        file_name = url[54:].rsplit('.ST', 1)[0]
        save_destination = 'C:\\Download data\\Data\\' + file_name + '.csv'
        download_data(url, save_destination)

我不这么认为
str(csv)
使用默认的编解码器进行解码,最终得到的是
str
not
bytes
.Wow。我收回。尽管文档将其原型化为
类str(object=b',encoding='utf-8',errors='strict')
(即,编码默认为utf-8),但描述中说“如果既没有给出编码也没有给出错误,str(object)将返回object.\uu str\uuu(),这是对象的“非正式”或可打印的字符串表示形式”。对于
字节
,这就是
“b'…'
。那么,是的,这就是解决方案。您使用什么机制来查看
b'…'
?这是一个字节字符串的python3表示形式,该字节字符串尚未解码为unicode
str
,但您的代码中没有任何内容正在编写字符串的
repr
版本。非常感谢,这非常有效!正如在
decode('utf-8')
的帮助下解决问题之前所建议的那样,为了可读性和简单性,我选择使用您建议的
urlretrieve