2015-02-23 110 views
1

我想说:为每个campaigns[0](即:"New York City", "DC", "New York", "Boston", "Detroit", "St. Louis", "Cleveland"),然后为每个row[2]一个CSV内,与campaigns[1], campaigns[2], campaigns[3]更换[city_name], [state_abbrev], [state_full]Python的CSV嵌套For循环的字符串替换

import csv 

campaigns = [ 
      ["New York City", "New York City", "New York", "NY"], 
      ["DC", "Washington DC", "Washington DC", "DC"], 
      ["New York", "New York", "New York", "NY"], 
      ["Boston", "Boston", "Massachusetts", "MA"], 
      ["Detroit", "Detroit", "Michigan", "MI"], 
      ["St. Louis", "St Louis", "Missouri", "MO"], 
      ["Cleveland", "Cleveland", "Ohio", "OH"] 
      ] 

with open('ExpandCampaign.csv', 'r') as f: 
    reader = csv.reader(f) 
    print(next(reader, None)) # Print the header 
    for campaign in campaigns: 
    for row in reader: 
     row[0] = campaign[0] 
     row[2] = row[2].replace('[city_name]', campaign[1].lower()) 
     row[2] = row[2].replace('[state_full]', campaign[2].lower()) 
     row[2] = row[2].replace('[state_abbrev]', campaign[3].lower()) 
     print(row) 

问题:上面的代码只输出纽约市,而不是其他广告系列名称[0]。

['New York City', 'Design', 'basement design', 'Exact'] 
['New York City', 'Floor Plans', 'basement design plans', 'Exact'] 
['New York City', 'Design', 'basement designs', 'Exact'] 
['New York City', 'Finishing', 'basement finished remodeling', 'Exact'] 
['New York City', 'Finishing', 'basement finishers ny', 'Exact'] 
['New York City', 'Finishing', 'basement finishing', 'Exact'] 
['New York City', 'Finishing', 'basement finishing new york city', 'Exact'] 

我不明白为什么它不通过每个campaign[0]名称迭代和它只是看到纽约市。例如,如果我打印:

with open('ExpandCampaign.csv', 'r') as f: 
    reader = csv.reader(f) 
    print(next(reader, None)) # Print the header 
    for campaign in campaigns: 
    print(campaign[0]) 

我得到:

['Campaign', 'Ad Group', 'Keyword', 'Type'] 
New York City 
DC 
New York 
Boston 
Detroit 
St. Louis 
Cleveland 

我试着周围的开关语句,但我所得到的结果是这样的:

['New York City', 'Finishing', 'basement finishing in new york city ny', 'Phrase'] 
['DC', 'Finishing', 'basement finishing in new york city ny', 'Phrase'] 
['New York', 'Finishing', 'basement finishing in new york city ny', 'Phrase'] 
['Boston', 'Finishing', 'basement finishing in new york city ny', 'Phrase'] 
['Detroit', 'Finishing', 'basement finishing in new york city ny', 'Phrase'] 
['St. Louis', 'Finishing', 'basement finishing in new york city ny', 'Phrase'] 
['Cleveland', 'Finishing', 'basement finishing in new york city ny', 'Phrase'] 

看看“纽约城”如何出现在非纽约市的活动中?这是我不想发生的事情,因为这些城市只与其各自的广告系列相关,而不是彼此相关。我如何解决这个问题的逻辑显然是在某个地方。

回答

1

您正在循环“for campaign”循环的第一遍中的所有行。添加打印语句像下面的代码片段,你会看到:

for campaign in campaigns: 
    print(campaign) # add this line 
    for row in reader: 
     row[0] = campaign[0] 
     row[2] = row[2].replace('[city_name]', campaign[1].lower()) 
     row[2] = row[2].replace('[state_full]', campaign[2].lower()) 
     row[2] = row[2].replace('[state_abbrev]', campaign[3].lower()) 
     print(row) 

也许你只是想在广告活动和像下面

for (campaign,row) in zip(campaigns, reader): 
     row[0] = campaign[0] 
     row[2] = row[2].replace('[city_name]', campaign[1].lower()) 
     row[2] = row[2].replace('[state_full]', campaign[2].lower()) 
     row[2] = row[2].replace('[state_abbrev]', campaign[3].lower()) 
     print(row) 

将终止在较短的两行一个循环的两个名单。

1

我停止使用csv.reader,而是在没有它的情况下阅读文件并且它可以正常工作。我不知道为什么这会起作用,并且csv.reader方法没有。

campaigns = [ 
      ["New York City", "New York City", "New York", "NY"], 
      ["DC", "Washington DC", "Washington DC", "DC"], 
      ["New York", "New York", "New York", "NY"], 
      ["Boston", "Boston", "Massachusetts", "MA"], 
      ["Detroit", "Detroit", "Michigan", "MI"], 
      ["St. Louis", "St Louis", "Missouri", "MO"], 
      ["Cleveland", "Cleveland", "Ohio", "OH"] 
      ] 

with open('ExpandCampaign.csv', 'r') as f: 
    print(next(f, None).strip().split(',')) # Print the header 
    rows = [row.strip().split(',') for row in f] 
    for campaign in campaigns: 
    for row in rows: 
     row[0] = campaign[0] 
     row[2] = row[2].replace('[city_name]', campaign[1].lower()) 
     row[2] = row[2].replace('[state_full]', campaign[2].lower()) 
     row[2] = row[2].replace('[state_abbrev]', campaign[3].lower()) 
     print(row)