为什么我不能在Python中加入这个元组?

63
e = ('ham', 5, 1, 'bird')
logfile.write(','.join(e))

我必须将它连接起来,这样我才能将其写入文本文件。


10
顺便说一下,你知道你可以不用括号来写第一行吗?这样做可以消除本质上是噪音的东西。 - djc
4个回答

137

join 只接受字符串列表,因此需要先将它们转换为字符串。

>>> e = ('ham', 5, 1, 'bird')
>>> ','.join(map(str,e))
'ham,5,1,bird'

或者更符合Python的风格

>>> ','.join(str(i) for i in e)
'ham,5,1,bird'

4
使用 str() 而不是 repr() 可能导致信息丢失。 - John Machin
1
这取决于你的目的是什么,但通常情况下str()是你想要向用户展示某些内容的方法(例如在日志文件中,这也是OP想要的)。 - Nick Craig-Wood
1
确实。str(__str__或更好的__unicode__)是为人类设计的。而且问题中提到了一个日志文件,这是为人类设计的。因此,在这种情况下,我认为str()比__repr__更好。 - extraneon
1
用户不会读取日志文件;如果没有充分的监督,他们会忽略它们,直到磁盘空间用尽,然后删除它们。程序员在调查问题时必须阅读日志文件。模糊的证据最多只是一个很大的麻烦。 - John Machin
日志文件只是对象名称(为了方便)。实际上,我希望人类能够阅读它们 :) - TIMEX

12

join() 仅适用于字符串,不适用于整数。请使用 ','.join(str(i) for i in e)


关于没有括号的元组的注释很好。 - serv-inc

4
你最好先将元组转换为列表:
e = ('ham', 5, 1, 'bird') list_e = list(e) ','.join(list_e)

3
使用 csv 模块。这将避免关于如何处理包含逗号的项目的后续问题,以及关于如何处理包含您用于引用/转义逗号的字符的项目的另一个问题。
import csv
e = ('ham', 5, 1, 'bird')
with open('out.csv', 'wb') as f:
    csv.writer(f).writerow(e)

检查一下:
print open('out.csv').read()

输出:

ham,5,1,bird

7
似乎过于复杂了。 - Mr. Lance E Sloan
1
@LS:一切并非表面看起来那样简单。简单地使用逗号分隔符而不考虑逗号转义等问题很快就会出现问题。 - John Machin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接