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

8

我有一个元组列表,格式如下:

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

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

我在使用write方法时遇到了问题。应该如何操作?


简短回答:print " ".join(map(str, DATA)) - Has QUIT--Anony-Mousse
6个回答

19

您可以使用:

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

其中f代表你的文件


11
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
只需使用 map(str, t) — 不需要 lambda。 - Thanatos
2
这里不需要使用lambda表达式。列表推导式是最佳实践,如果必须使用map函数,只需使用内置的str方法,例如' '.join(map(str,t)) - Kenan Banks
谢谢,我忘了你可以只放函数。同时改成了一个推导式。 - U-DON
2
@U-DON 如果你使用[str(x) for x in t]或者map(str,t),你会为每一行创建一个列表对象来写入。但是**join()**方法接受生成器作为参数:' '.join((str(x) for x in t)),在这种情况下,生成器的括号可以省略:' '.join(str(x) for x in t) - eyquem

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

简单。将元组/列表映射为字符串,然后使用" "连接它们。

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'

Edit 1

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

如果出于个人喜好、好奇心、宗教信仰、梦游症状、为了给妻子留下印象、取悦任性的孩子、或者因为计算机里住着一个精神病鬼魂,每次在磁盘上写入正统的\r\n换行符时就尖叫不止,或者仅仅是因为你的算法需要……是的,有可能你只想在磁盘上写入一个换行符\n……这并不是科幻小说,它确实可能发生,你知道吗……我曾经遇到过这种情况,是的,信不信由你,我不得不在Windows上单独写入一个\n,没有来自某些Python教皇的任何nihil obstat和补充的imprimatur!……是的,这种情况可能会发生,然后,在系好安全带之后,你可以,是的,我们可以,在Windows上写入一个换行符\n!是的,是的,是的,这是可能的,而且不会导致灾难。

只有在以下情况中的一个,且您已经具备法定年龄和全部精神能力,且没有过量饮用啤酒或葡萄酒的情况下,您才能使用 'wb' ,在 Windows 磁盘上写入单独的换行符 \n

但这并非强制性操作!您可以选择执行或不执行此操作。

.

另一个要注意的问题是,当Python以'r'模式读取文件时,默认情况下启用了通用换行符支持(参见PEP 278):这意味着Python在文件中发现的所有类型的换行符都会被转换成单个字符\n

但也可能出现您需要读取文件而不进行任何换行符转换的情况。在这种情况下,您可以使用'rb'模式读取特定文件,而不是禁用通用换行符支持。

但并非强制要求您这样做,我也不鼓励任何人这样做或相反。您可以自由选择,所有这些荒谬的东西只是为了解释一些有用的知识。

.

编辑 2

我曾尝试使用writelines(),但我没有想到可以使用%格式化来简单地添加换行符。

现在我已经看到了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时才成立


请不要鼓励新手用户在Windows上以二进制模式编写文本文件。如果您使用的是Windows,则通常希望有一个孤立的\n,因为某些Windows软件会表现得很奇怪。例如,记事本将一个孤立的\n视为零宽度空格,而不是行分隔符。期望跨境文本文件的读者可以使用“rU”(通用换行符)模式。 - John Machin
@John Machin,你在哪里看到我煽动别人在Windows上使用“'rb'”模式写入?!我提供了一个很难找到的解释。人们选择并做他们想做的事情。当然,在Windows上需要以“'rb'”模式写入的情况不常见,但有一次我就是这种情况,而且在特殊处理Windows文件时,我长时间处于混乱状态,直到自己理解了奇怪结果的原因。我不想使用“'rb'”,但我被迫这样做。 - eyquem
写二进制应该是wb而不是rb,除非你提供更好的解释或一些示例,否则最好只是参考文档:http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files。如果你帮助他们找到,它并不是“难以找到”的。我同意声明你在激发新手用户以二进制模式编写文本文件是过于严厉的,但仍然同意否决。 - Derek Litz
1
@Eyquem:如果你在Windows上需要写一个单独的\n,那么这是因为文件是一个二进制文件或者需要以Unix格式进行编写。请阅读PEP 278比第一行更深入一些:是的,默认情况下启用通用换行符支持,但这意味着“除非您在编译Python的C源代码时将其排除在外,否则将其提供”——它仅由“import”和“execfile”自动使用。‘U’或‘rU’不是读取文件的默认模式。 - John Machin

1

没有人提到简单地做:

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

这有几个优点。首先,它更容易理解你正在做什么,格式非常明显易于修改,而且你永远不会忘记使用str(object)。

相比连接解决方案,这种方法的缺点是如果元组大小发生改变,它将无法正常工作,并显示以下其中一种错误信息:

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

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

在我看来,如果元组的大小不会变化,那么最符合Python风格的做法就是采用这里介绍的版本。

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/


0

这个例子将允许您循环遍历元组列表,并将每个元组写入文本文件的新行中。请注意,我使用的是Unicode而不是字符串:

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

以上答案首先将您的数据映射到字符串格式,如果您的数据尚未处于Unicode格式,则可以使用该方法。


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