这是我第一个关于Stackoverflow/step-into-real编码的Python脚本/问题。你知道吗
我希望计算某些字符串在我遍历的行中出现的次数,然后打印出值。我没有设置分隔符,因此只有一列。本质上,我是说,如果列包含所说的字符串,那么添加到计数器。你知道吗
问题是,所有变量的输出都是0。有什么建议吗?你知道吗
这是密码(抱歉太长了)。你知道吗
# read the CSV file
import csv
with open('example.csv', 'r') as csvfile:
reader = csv.reader(csvfile)
# set up counter variables
googlebot = 0
googlebot_mobile = 0
apis_google = 0
adsense = 0
adsbot_mobile_web_android = 0
adsbot_mobile_web = 0
adsbot = 0
googlebot_images = 0
googlebot_news = 0
googlebot_video = 0
mobile_adsense = 0
mobile_apps_android = 0
# set up counter identifiers
googlebot_string = 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
googlebot_mobile_string = 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
apis_google_string = 'APIs-Google (+https://developers.google.com/webmasters/APIs-Google.html)'
adsense_string = 'Mediapartners-Google'
adsbot_mobile_web_android_string = 'Mozilla/5.0 (Linux; Android 5.0; SM-G920A) AppleWebKit (KHTML, like Gecko) Chrome Mobile Safari (compatible; AdsBot-Google-Mobile; +http://www.google.com/mobile/adsbot.html)'
adbot_mobile_web_string = 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; AdsBot-Google-Mobile; +http://www.google.com/mobile/adsbot.html)'
adsbot_string = 'AdsBot-Google (+http://www.google.com/adsbot.html)'
googlebot_images_string = 'Googlebot-Image/1.0'
googlebot_news_string = 'Googlebot-News'
googlebot_video_string = 'Googlebot-Video/1.0'
mobile_adsense_string = 'compatible; Mediapartners-Google/2.1; +http://www.google.com/bot.html'
mobile_apps_android_string = 'AdsBot-Google-Mobile-Apps'
# iterate and search for/add to counter
for row in reader:
if googlebot_string in row:
googlebot += 1
elif googlebot_mobile_string in row:
googlebot_mobile += 1
elif apis_google_string in row:
apis_google += 1
elif adsense_string in row:
adsense += 1
elif adsbot_mobile_web_android_string in row:
adsbot_mobile_web_android += 1
elif adbot_mobile_web_string in row:
adsbot_mobile_web += 1
elif adsbot_string in row:
adsbot += 1
elif googlebot_images_string in row:
googlebot_images += 1
elif googlebot_news_string in row:
googlebot_news += 1
elif googlebot_video_string in row:
googlebot_video += 1
elif mobile_adsense_string in row:
mobile_adsense += 1
elif mobile_apps_android_string in row:
mobile_apps_android += 1
# print counts
print "Googlebot (Desktop): ", googlebot
print "Googlebot (Mobile): ", googlebot_mobile
print "APIs Google: ", apis_google
print "AdSense: ", adsense
print "AdsBot Mobile Web Android: ", adsbot_mobile_web_android
print "AdsBot Mobile Web: ", adsbot_mobile_web
print "AdsBot: ", adsbot
print "Googlebot Images: ", googlebot_images
print "Googlebot News: ", googlebot_news
print "Googlebot Video: ", googlebot_video
print "Mobile AdSense: ", mobile_adsense
print "Mobile Apps Android: ", mobile_apps_android
如果不指定分隔符,则使用默认分隔符,即逗号
,
。因此,列表row
中仍然可能有多个列,因此也可能有多个元素。你知道吗现在,
googlebot_string
中的字符串也包含逗号,因此,如果这个字符串出现在您的输入CSV中,它就不会作为单个元素出现在row
中。因此googlebot_string in row
总是false
。其他一些*_string
字符串也有同样的问题。你知道吗您可以将文件作为文本文件打开(无需使用
csv
模块)并遍历行。你知道吗一个肮脏的解决方案是将输入文件中不存在的字符指定为
csv.reader
的分隔符。你知道吗您正在
with
上下文管理器外部读取文件。 您的代码应该是:否则,您将在读取文件之前打开和关闭文件。你知道吗
编辑:
正如@yann vernier所指出的,
reader
必须在with
块中使用。也就是说,for
循环应该全部缩进。你知道吗相关问题 更多 >
编程相关推荐