7
7
import dateutil
8
8
import io
9
9
try :
10
- from urllib2 import urlopen
10
+ from urllib2 import urlopen , Request
11
11
except ImportError :
12
- from urllib .request import urlopen
12
+ from urllib .request import urlopen , Request
13
13
14
14
import pandas as pd
15
15
@@ -164,14 +164,23 @@ def readtmy3(filename=None, coerce_year=None, recolumn=True):
164
164
165
165
head = ['USAF' , 'Name' , 'State' , 'TZ' , 'latitude' , 'longitude' , 'altitude' ]
166
166
167
- try :
168
- csvdata = open (filename , 'r' )
169
- except IOError :
170
- response = urlopen (filename )
167
+ if filename .startswith ('http' ):
168
+ request = Request (filename , headers = {'User-Agent' :
169
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) '
170
+ 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 '
171
+ 'Safari/537.36' })
172
+ response = urlopen (request )
171
173
csvdata = io .StringIO (response .read ().decode (errors = 'ignore' ))
174
+ else :
175
+ # assume it's accessible via the file system
176
+ csvdata = open (filename , 'r' )
177
+
178
+ # read in file metadata, advance buffer to second line
179
+ firstline = csvdata .readline ()
180
+ if 'Request Rejected' in firstline :
181
+ raise IOError ('Remote server rejected TMY file request' )
172
182
173
- # read in file metadata
174
- meta = dict (zip (head , csvdata .readline ().rstrip ('\n ' ).split ("," )))
183
+ meta = dict (zip (head , firstline .rstrip ('\n ' ).split ("," )))
175
184
176
185
# convert metadata strings to numeric types
177
186
meta ['altitude' ] = float (meta ['altitude' ])
@@ -180,8 +189,12 @@ def readtmy3(filename=None, coerce_year=None, recolumn=True):
180
189
meta ['TZ' ] = float (meta ['TZ' ])
181
190
meta ['USAF' ] = int (meta ['USAF' ])
182
191
192
+ # use pandas to read the csv file/stringio buffer
193
+ # header is actually the second line in file, but tell pandas to look for
194
+ # header information on the 1st line (0 indexing) because we've already
195
+ # advanced past the true first line with the readline call above.
183
196
data = pd .read_csv (
184
- filename , header = 1 ,
197
+ csvdata , header = 0 ,
185
198
parse_dates = {'datetime' : ['Date (MM/DD/YYYY)' , 'Time (HH:MM)' ]},
186
199
date_parser = lambda * x : _parsedate (* x , year = coerce_year ),
187
200
index_col = 'datetime' )
0 commit comments