繁体   English   中英

为什么Python在列表中串联字符串而不是遍历它们?

[英]Why is Python concatenating strings in a list rather than iterating over them?

在Python CGI脚本中,我有一些字符串列表,这些字符串是哈希键:

APPENDIX_WEBSITES = ['CJSHayward']
MAIN_WEBSITES = ['Alfresco',
  'Bible',
  'Fathers',
  'MyCollab',
  'Koha',
  'MediaWiki',
  'Moodle',
  'RequestTracker',
  'SuiteCRM',
  'TikiWiki',
  'Wordpress']
# The variable "data" is populated with a hash containing all above entries as keys.
sys.stderr.write(repr(MAIN_WEBSITES) + '\n')
sys.stderr.write(repr(APPENDIX_WEBSITES) + '\n')
sys.stderr.write(repr(MAIN_WEBSITES + APPENDIX_WEBSITES) + '\n')
for website in MAIN_WEBSITES + APPENDIX_WEBSITES:
    sys.stderr.write(website)

Apache日志忠实记录:

[Tue Aug 08 16:25:34.266769 2017] [cgi:error] [pid 16429] [client 127.0.0.1:40600] AH01215: ['Alfresco', 'Bible', 'Fathers', 'MyCollab', 'Koha', 'MediaWiki', 'Moodle', 'RequestTracker', 'SuiteCRM', 'TikiWiki', 'Wordpress']: /usr/local/websites/home/www/configure/index.cgi, referer: http://localhost/
[Tue Aug 08 16:25:34.267050 2017] [cgi:error] [pid 16429] [client 127.0.0.1:40600] AH01215: ['CJSHayward']: /usr/local/websites/home/www/configure/index.cgi, referer: http://localhost/
[Tue Aug 08 16:25:34.267268 2017] [cgi:error] [pid 16429] [client 127.0.0.1:40600] AH01215: ['Alfresco', 'Bible', 'Fathers', 'MyCollab', 'Koha', 'MediaWiki', 'Moodle', 'RequestTracker', 'SuiteCRM', 'TikiWiki', 'Wordpress', 'CJSHayward']: /usr/local/websites/home/www/configure/index.cgi, referer: http://localhost/
[Tue Aug 08 16:25:34.267490 2017] [cgi:error] [pid 16429] [client 127.0.0.1:40600] AH01215: AlfrescoAlfrescoBibleBibleFathersFathersMyCollabMyCollabKohaKohaMediaWikiMediaWikiMoodleMoodleRequestTrackerRequestTrackerSuiteCRMSuiteCRMTikiWikiTikiWiki: /usr/local/websites/home/www/configure/index.cgi, referer: http://localhost/

令我惊讶的是,它似乎在单个字符串上进行了一次迭代(列表的多余连接),而不是在repr似乎识别为字符串列表的基础上进行了迭代,这正是我的意图。

如何通过“ CJSHayward”向上循环遍历“ Alfresco”,“ Bible”等?

正如评论者所指出的那样,您必须在website添加换行符( \\n ),以便每个网站都可以在Apache日志中显示在其自己的行上。

for website in MAIN_WEBSITES + APPENDIX_WEBSITES:
    sys.stderr.write(website + '\n')

那将解决您的问题。 但是, 您可能想知道为什么这可以解决问题

期望每次对sys.stderr.write调用都会在日志中产生自己的行并不奇怪。 并非如此的原因是因为sys.stderr是流。 流是将数据发送到某处的抽象。 在这种情况下, sys.stderr.write 将写入标准错误流,而您的Apache日志将从标准错误流中读取 Apache日志不知道您调用sys.stderr.write 它只知道在流中可以看到的内容。 例如,Apache日志不可能知道两者之间的区别

sys.stderr('HelloWorld')

sys.stderr('Hello')
sys.stderr('World')

在这两种情况下,Apache日志(以及从标准错误中读取的其他应用程序)仅能看到字符流'HelloWorld' 因此,Apache日志必须使用换行符( \\n )将标准错误流划分为单独的行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM