【问题标题】:Why is Python concatenating strings in a list rather than iterating over them?为什么 Python 连接列表中的字符串而不是遍历它们?
【发布时间】:2018-01-16 03:18:23
【问题描述】:

在 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 日志如实记录:

[2017 年 8 月 8 日星期二 16:25:34.266769] [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,引用者:http: //本地主机/
[2017 年 8 月 8 日星期二 16:25:34.267050] [cgi:error] [pid 16429] [client 127.0.0.1:40600] AH01215: ['CJSHayward']: /usr/local/websites/home/www/configure/index .cgi,引用:http://localhost/
[2017 年 8 月 8 日星期二 16:25:34.267268] [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,引用者:http ://本地主机/
[Tue Aug 08 16:25:34.267490 2017] [cgi:error] [pid 16429] [client 127.0.0.1:40600] AH01215: AlfrescoAlfrescoBibleBibleFathersFathersMyCollabMyCollabKohaKohaMediaWikiMediaWikiMoodleMoodleRequestTrackerRequestTrackerSuiteCRMSuiteCRMTikiWikiTikiWiki: /usr :http://localhost/

我很惊讶它似乎在单个字符串上迭代一次(列表的冗余串联),而不是在 repr 似乎识别为字符串列表的内容上进行迭代,这正是我的意图。

如何让循环通过“CJSHayward”向上迭代“Alfresco”、“Bible”等?

【问题讨论】:

  • 它确实遍历了各个网站名称。但是,您在没有任何换行符的情况下将它们写出来,因此它们都在输出时一起运行。如果您希望它们在日志中作为单独的行,请在其中添加一个换行符,就像您对前三行所做的那样。
  • sys.stderr.write(repr(MAIN_WEBSITES) + '\n') 只是将列表写为附加换行符的字符串。
  • for website in MAIN_WEBSITES + APPENDIX_WEBSITES: sys.stderr.write(website) 迭代连接的列表,但 sys.stderr.write 默认情况下不附加换行符。所以,似乎你得到了字符串的连接,但你没有。如果你想在每次调用write 后换行,你必须明确:sys.stderr.write('{}\n'.format(website))
  • 您忘记了循环中的+ '\n'。投票结束是错字。
  • 使用print(<whatever>, file=sys.stderr) 更轻松

标签: python list


【解决方案1】:

正如评论者所指出的,您必须在 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) 将标准错误流分成单独的行。

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 2021-05-16
    相关资源
    最近更新 更多