我正在编写一个脚本,对一个供应商进行API调用。 最初的调用会返回一个JSON列表,其中包含一个URI列表,以便我从中获取数据。 当我连接到其中一个URI并检索数据时,返回的不是JSON,而是以逗号分隔的。 我可以毫无问题地将其写入CSV文件。
我想做的是把它直接写入我的数据库,问题就在这里。 这些行是以\n为界的,字段是以逗号为界的,有时它们用双引号括起来,有时不括。 使问题更加复杂的是,一些被双引号括起来的字段里有逗号。
我需要能够得到标题(我已经弄明白了),这样我就可以用它们作为字段名写入数据库(供应商喜欢改变顺序,偶尔会排除一些字段),我不能只是把数据倒入表中,因为可能会有新的或丢失的或不符合顺序的字段。 我已经尝试了很多方法,但没有任何方法可以正确地分割这个字符串。
下面是数据集中一行的例子。 【替换代码0
What I need is
"July Test", "", "nothing to see here", "1043 E Main, Dallas, TX 40565", "more random crap"
下面是我的HTTP调用和处理返回的情况。 也许我应该用不同的方法来处理? 我已经注释了所有我尝试过的和失败过的东西。
Takes the URL for the most current file and opens connection and exports data
site= str(x["full_csv_url"])
hdr = {'User-Agent': 'Mozilla/5.0'}
req = Request(site,headers=hdr)
req.add_header('Authorization', token)
with urlopen(req) as x:
data = x.read().decode('utf-8')
#for i in data.split('\n'):
# list = print([i])
list_of_lines = data.splitlines(True)
new_split_data = []
for i in range(1, 2): #nlines
ith_line = str(list_of_lines[i])
ith_line = ith_line.replace("\n","")
ith_line = ith_line.replace("\r","")
"""Split a python-tokenizable expression on comma operators"""
#compos = [-1] # compos stores the positions of the relevant commas in the argument string
#compos.extend(t[2][1] for t in generate_tokens(StringIO(ith_line).readline) if t[1] == ',')
#compos.append(len(ith_line))
#new_ith_line = [ ith_line[compos[i]+1:compos[i+1]] for i in xrange(len(compos)-1)]
#for i in new_ith_line:
# print[i]
print(ith_line)
print("New Line")
print("New Line")
#new_ith_line = re.split(r', (?=(?:"[^"]*?(?: [^"]*)*))|, (?=[^",]+(?:,|$))', ith_line)
new_ith_line = list(csv.reader(ith_line, delimiter=','))
#new_ith_line = re.split(r',(?=")', ith_line)
#new_ith_line = new_ith_line.replace("'\"","'")
#new_ith_line = new_ith_line.replace("\"'","'")
print(new_ith_line)
##Didnt work-- split fields with commas between double quotes
##newstr = ith_line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)")
# Didnt work, only returned 1st 2 columns
#print(pp.commaSeparatedList.parseString(ith_line).asList())
# Didnt work, returned error
#newStr = [ '"{}"'.format(x) for x in list(csv.reader([ith_line], delimiter=',', quotechar='"'))[0] ]
#print(newStr)
#print(ith_line)
#each_line = data.body.getText().partition("\n")[i]