我有一个元组列表,格式如下:
("some string", "string symbol", some number)
例如,
("Apples", "=", 10)
。我需要将它们写入输出文件,如下所示:Apples = 10
我在使用write方法时遇到了问题。应该如何操作?
您可以使用:
for t in some_list:
f.write(' '.join(str(s) for s in t) + '\n')
其中f
代表你的文件
。
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()
给定一个元组列表,你以写模式打开一个文件。对于列表中的每个元组,你将其所有元素转换为字符串,用空格连接它们来形成一个字符串,并在文件中写入该字符串和一个新行。然后你关闭文件。
编辑:没有意识到你是从一个元组列表开始的。已经进行了更改以反映这一点。
map(str, t)
— 不需要 lambda。 - Thanatosstr
方法,例如' '.join(map(str,t))
。 - Kenan Banks[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>>> data= ("Apples", "=", 10)
>>> print " ".join(map(str, data))
Apples = 10
" "
连接它们。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'
应该使用'wb'
而不是'rb'
当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'
模式读取特定文件,而不是禁用通用换行符支持。
但并非强制要求您这样做,我也不鼓励任何人这样做或相反。您可以自由选择,所有这些荒谬的东西只是为了解释一些有用的知识。
.
我曾尝试使用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时才成立
\n
,因为某些Windows软件会表现得很奇怪。例如,记事本将一个孤立的\n
视为零宽度空格,而不是行分隔符。期望跨境文本文件的读者可以使用“rU”(通用换行符)模式。 - John Machin\n
,那么这是因为文件是一个二进制文件或者需要以Unix格式进行编写。请阅读PEP 278比第一行更深入一些:是的,默认情况下启用通用换行符支持,但这意味着“除非您在编译Python的C源代码时将其排除在外,否则将其提供”——它仅由“import”和“execfile”自动使用。‘U’或‘rU’不是读取文件的默认模式。 - John Machin没有人提到简单地做:
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
这个例子将允许您循环遍历元组列表,并将每个元组写入文本文件的新行中。请注意,我使用的是Unicode而不是字符串:
with open('filename.txt','w') as f:
for tup in list_of_tuples:
f.write( u" ".join(map(unicode,tup))+u"\n")
以上答案首先将您的数据映射到字符串格式,如果您的数据尚未处于Unicode格式,则可以使用该方法。
print " ".join(map(str, DATA))
- Has QUIT--Anony-Mousse