我正通过Python
从Google Adwords Reporting API中提取数据。我可以成功提取数据,然后将其保存在可变数据中。
data = get_report_data_from_google()
type(data)
str
以下是一个示例:
data = 'ID,Labels,Date,Year\n3179799191,"[""SKWS"",""Exact""]",2016-05-16,2016\n3179461237,"[""SKWS"",""Broad""]",2016-05-16,2016\n3282565342,"[""SKWS"",""Broad""]",2016-05-16,2016\n'
我需要更多地处理这些数据,并最终输出处理过的平面文件(Google Adwords API可以返回CSV,但我需要在将数据加载到数据库之前对其进行预处理。)。
如果我尝试将data
转换为csv
对象,并尝试打印每一行,每行会得到一个字符,如:
c = csv.reader(data, delimiter=',')
for i in c:
print(i)
['I']
['D']
['', '']
['L']
['a']
['b']
['e']
['l']
['s']
['', '']
['D']
['a']
['t']
['e']
所以,我的想法是将每行的每一列处理成一个列表,然后将其添加到csv
对象。试着这样:
for line in data.splitlines():
print(line)
3179799191,"[""SKWS"",""Exact""]",2016-05-16,2016
我实际发现的是str
内部有一个列表:" ["" SKWS"","& #34;精确""]"
此值为"标签" documentation
这个列表格式有点奇怪 - 它在值中有很多括号,所以尝试使用引号char,比如",将返回如下内容:[SKWS Exact]。如果我可以接受["" SKWS"""" Exact""],那是可以接受的。
有没有一种方法可以在str
中提取列表对象?有没有更好的方法来处理和输出这些数据到csv?
答案 0 :(得分:2)
您需要先拆分字符串。 splitlines()
期望在每次迭代时提供单行,就像标准文件对象一样。如果您有一个包含换行符的字符串,请使用>>> import csv
>>> data = 'ID,Labels,Date,Year\n3179799191,"[""SKWS"",""Exact""]",2016-05-16,2016\n3179461237,"[""SKWS"",""Broad""]",2016-05-16,2016\n3282565342,"[""SKWS"",""Broad""]",2016-05-16,2016\n'
>>> c = csv.reader(data.splitlines(), delimiter=',')
>>> for line in c:
... print(line)
...
['ID', 'Labels', 'Date', 'Year']
['3179799191', '["SKWS","Exact"]', '2016-05-16', '2016']
['3179461237', '["SKWS","Broad"]', '2016-05-16', '2016']
['3282565342', '["SKWS","Broad"]', '2016-05-16', '2016']
分隔换行符:
{{1}}
答案 1 :(得分:0)
这与csv.reader
的工作方式有关。
根据文件:
csvfile 可以是任何支持迭代器协议的对象,并在每次调用
next()
方法时返回一个字符串
这里的问题是,如果传递一个字符串,它支持迭代器协议,并为每次调用next
返回一个字符。然后csv阅读器将每个字符视为一行。
您需要提供一个行列表,一行用于csv的每一行。例如:
c = csv.reader(data.split(), delimiter=',')
for i in c:
print i
# ['ID', 'Labels', 'Date', 'Year']
# ['3179799191', '["SKWS","Exact"]', '2016-05-16', '2016']
# ['3179461237', '["SKWS","Broad"]', '2016-05-16', '2016']
# ['3282565342', '["SKWS","Broad"]', '2016-05-16', '2016']
现在,您的列表看起来像JSON列表。您可以使用json
模块阅读它。