在Python中将元组列表写入文本文件

时间:2011-12-03 07:23:24

标签: python tuples

我有一个格式列表:

("some string", "string symbol", some number)

例如,("Apples", "=", 10)。我需要将它们写入输出文件,如下所示:

Apples = 10

我在使用write方法时遇到问题。怎么办呢?

6 个答案:

答案 0 :(得分:9)

您可以使用:

for t in some_list:
  f.write(' '.join(str(s) for s in t) + '\n')

其中f是您的file

答案 1 :(得分:6)

list_of_tuples = [('Apples', '=', 10), ('Oranges', '<', 20)]
f = open('file.txt', 'w')
for t in list_of_tuples:
    line = ' '.join(str(x) for x in t)
    f.write(line + '\n')
f.close()

给定元组列表,您可以在写入模式下打开文件。对于列表中的每个元组,将其所有元素转换为字符串,按空格连接以形成字符串,并将带有新行的字符串写入文件。然后关闭文件。

编辑:没有意识到你开始使用元组列表。做出改变以反映这一点。

答案 2 :(得分:1)

lot = [('Apples', '=', 10),
       ('Oranges', '<', 20),
       ('Peaches','(Florida)','No stock')]

with open('tototo.txt','w') as f:
    f.write( '\n'.join(' '.join(str(x) for x in tu) for tu in lot) )

在写作之前创建整个文本会使写作一次性完成 前提是文本长度不是25 GB ....

请注意,在Windows上,如果模式为'w',则每次必须写入 \ n 时,操作系统都会写 \ r \ n ; <登记/> 如果您只想编写 \ n ,则必须将模式定义为'rb'

PS

'wb',而不是rb'

编辑1

当Python在Windows上以'w'模式写入磁盘时,操作系统Windows将 \ r \ n 序列写为行的末尾,当它有要在磁盘上写入的行时,当必须编写包含换行符的字符串时,无论这些换行符是什么,单独 \ n \ r \ n

如果出于任何个人心血来潮,好奇心,宗教信仰,或作为梦游症的症状,或给你的妻子留下深刻印象,或为了取悦你的反复无常的孩子,或因为生活在你电脑里的精神病患鬼并尖叫时间正统的 \ r \ n 换行符写在磁盘上,或者只是因为你的算法需要它......是的,你可能想要只写一个换行符 \ n 在磁盘上....这不是科幻小说,它可能真的发生了,你现在.....它发生在我身上,是的,不管你信不信,我面对的事实是我有必要在Windows上的磁盘上单独写一个 \ n ,而没有来自某个pythonist教皇的任何 nihil obstat 和补充 imprimatur ! ......好吧,是的,它可能会发生,然后,在锁上你的安全带之后,你可以,是的,我们可以在Windows上的磁盘上写一个换行符 \ n !是的是的,这是可能的,而不是诅咒的原因

然后,只有在其中一种情况下,如果您有法定年龄和所有心理能力,并且没有喝过啤酒或过量的葡萄酒,您可以使用'wb'撰写换行符 \ n 单独在Windows上的磁盘上。

但那强制性!你可以自由地这样做吗

另一件事是当Python以'r'模式读取文件时,默认情况下启用通用换行支持(参见PEP 278):它包含Python在文件中找到的所有类型的换行都是转换为单个字符 \ n

但是,您可能还需要在没有任何换行符的情况下读取文件。在这种情况下,您可以在模式'rb'

中读取特定文件,而不是禁用通用换行支持

但你没有义务,我也没有煽动任何人这样做或相反。你做你想做的事,所有荒谬的事情都是解释一些有用的东西。

编辑2

我曾尝试使用 writelines(),但我没想过使用%格式化来添加带有sipmplicity的换行符。

现在我已经看到了Derek Litz的答案,我有一个明显的解决方案:

lot = [('Apples', '=', 10),
       ('Nuts', '<', 20),
       ('Peaches','(Florida)','No stock')]

with open('tototo.txt','w') as f:
    f.writelines( '%s %s %s\n' % tu for tu in lot )

仅当所有元组的元组长度为3时

答案 3 :(得分:1)

>>> data= ("Apples", "=", 10)
>>> print " ".join(map(str, data))
Apples = 10

易。将元组/列表映射到字符串,然后将它们与" "连接起来。

答案 4 :(得分:1)

没有人提到过这样做:

with open('file_name', 'w') as f:
    for tuple in tuples:
        f.write('%s %s %s\n' % tuple)

这有几个了。理解您正在做的事情更容易,格式非常明显且易于修改,您永远不会忘记使用str(对象)。

与连接解决方​​案相比,它的缺点是如果元组更改大小,它将无法与以下回溯之一一起使用:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string

(尝试将它们复制为练习。)

在我看来,如果元组的大小不同,最蟒蛇的事情就是这里提供的版本。

import this #and decide for yourself :)

另外,请参阅资源以获取更多信息(按与问题相关的顺序):

http://docs.python.org/library/stdtypes.html#string-formatting-operations

http://docs.python.org/library/string.html

http://www.python.org/dev/peps/pep-0292/

答案 5 :(得分:0)

此示例允许您遍历元组列表并将每个元组写入文本文件中的新行。请注意,我使用unicode而不是string:

with open('filename.txt','w') as f:
        for tup in list_of_tuples:
            f.write( u" ".join(map(unicode,tup))+u"\n")

以上答案首先将您的数据映射到字符串格式,如果您的数据尚未采用unicode格式,这是可以的。