从字符串中提取列表

时间:2016-05-18 21:29:42

标签: python csv

我正通过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?

2 个答案:

答案 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模块阅读它。