2016-03-01 219 views
2

我正嘗試下載.csv文件並將其保存到我的計算機上。但是,當我運行下面的腳本,我收到錯誤「錯誤:行包含NULL字節」。我做錯了什麼?使用python下載.csv文件

import csv 
import urllib2 

url = 'http://wildfire.alberta.ca/reports/activedd.csv' 
response = urllib2.urlopen(url) 
cr = csv.reader(response) 

for row in cr: 
    print row 

回答

3

您要下載的文件採用UTF-16格式,而CSV模塊不是爲此設計的。您需要將其從UTF-16解碼爲其他格式。例如:

import csv 
import codecs 
import urllib2 

url = 'http://wildfire.alberta.ca/reports/activedd.csv' 
response = urllib2.urlopen(url) 
cr = csv.reader([x.strip() for x in codecs.iterdecode(response, 'UTF-16')]) 

data = [x for x in cr] 

# Manipulate the data here 

# Now to save the CSV: 
with open('outputfile.csv', 'wb') as output: 
    writer = csv.writer(output) 
    writer.writerows(data) 

如果你只需要下載的文件,而不是操縱它,有更好的方法(見minitoto的答案)。

這是一個例子,和換行符必須手動剝離使其正常工作,所以我敢肯定,也許有更好的方法,但是這是最主要的問題

+0

此代碼不能運行。 – Rishav

+0

@Rishav是的,我的壞,在一次運行中複製我的測試代碼,並寫入解碼,而不是iterdecode。我現在已經修好了 – meiamsome

+0

謝謝!還有一件事,如果我想將文件保存在我的電腦上,我該怎麼辦? – atari

-1

這就是我所做的。懶惰的方式。

import urllib2 

url = 'http://wildfire.alberta.ca/reports/activedd.csv' 
response = urllib2.urlopen(url) 
with open('activeddData.csv','w') as csvFile: 
    for line in response.readlines(): 
     csvFile.write(line) 
+0

不要忘記留下評論如果downvoting – sgiri

+0

'與開放('activeddData.csv','W')作爲csvFile'你在哪部分提到寫入文件? – Rishav

+0

@Rishav'對於response.readlines()行:'迭代每行響應,'csvFile.write(line)'將每行寫入一個名爲''activeddData.csv''的新文件' – sgiri

1

我想最簡單的方法是使用urlretrieve

import urllib 

url = 'http://wildfire.alberta.ca/reports/activedd.csv' 
urllib.urlretrieve(url, "activedd.csv") 
+0

別忘了如果downvoting留下評論 – tinySandy