Python:CSV直接来自web,导致数据无法使用
我正在Windows上使用Python 3.5 我有一段代码,可以从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
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
notbytes
.Wow。我收回。尽管文档将其原型化为类str(object=b',encoding='utf-8',errors='strict')
(即,编码默认为utf-8),但描述中说“如果既没有给出编码也没有给出错误,str(object)将返回object.\uu str\uuu(),这是对象的“非正式”或可打印的字符串表示形式”。对于字节
,这就是“b'…'
。那么,是的,这就是解决方案。您使用什么机制来查看b'…'
?这是一个字节字符串的python3表示形式,该字节字符串尚未解码为unicodestr
,但您的代码中没有任何内容正在编写字符串的repr
版本。非常感谢,这非常有效!正如在decode('utf-8')
的帮助下解决问题之前所建议的那样,为了可读性和简单性,我选择使用您建议的urlretrieve
。