[英]How to write a list to a file with newlines in Python3
我正在尝试使用 Python 3 将数组(列表?)写入文本文件。目前我有:
def save_to_file(*text):
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
for lines in text:
print(lines, file = myfile)
myfile.close
这会将看起来像数组的内容直接写入文本文件,即,
['element1', 'element2', 'element3']
username@machine:/path$
我要做的是创建文件
element1
element2
element3
username@machine:/path$
我尝试了不同的方法来循环并附加一个“\\n”,但似乎写入正在一个操作中转储数组。 问题类似于如何将字符串列表写入文件,添加换行符? 但是语法看起来像是用于 Python 2 的? 当我尝试修改后的版本时:
def save_to_file(*text):
myfile = open('/path/to/filename.txt', mode='wt', encoding='utf-8')
for lines in text:
myfile.write(lines)
myfile.close
...Python shell 给出了“TypeError: must be str, not list”,我认为这是因为 Python2 和 Python 3 之间的变化。让每个元素都换行我错过了什么?
编辑:感谢@agf 和@arafangion; 结合你们两个写的,我想出了:
def save_to_file(text):
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
myfile.write('\n'.join(text))
myfile.write('\n')
看起来我对 "*text" 有部分问题(我读过扩展参数,但直到你写道 [element] 变成 [[element]] 我得到了一个 str-not-列表类型错误;我一直认为我需要告诉定义它正在获取传递给它的列表/数组,并且仅说明“测试”将是一个字符串。)一旦我将其更改为文本并使用 myfile.txt ,它就起作用了。使用 join 写入,附加的 \\n 将放在文件末尾的最后一个换行符中。
myfile.close
- 去掉你使用with
。 with
自动关闭myfile
,并且您必须像close()
一样调用close
才能在您不使用with
时执行任何操作。 您应该始终在 Python 3 上使用with
。
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
myfile.write('\n'.join(lines))
不要使用print
写入文件——使用file.write
。 在这种情况下,你想写一些中间有换行符的行,所以你可以用'\\n'.join(lines)
连接这些行,并将创建的字符串直接写入文件。
如果要素lines
不是字符串,试试:
myfile.write('\n'.join(str(line) for line in lines))
首先转换它们。
由于不同的原因,您的第二个版本不起作用。 如果你通过
['element1', 'element2', 'element3']
到
def save_to_file(*text):
它会变成
[['element1', 'element2', 'element3']]
因为*
将它获得的每个参数放入一个列表中,即使您传递的内容已经是一个列表。
如果你想支持传递多个列表,并且仍然一个接一个地写它们,那么做
def save_to_file(*text):
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
for lines in text:
myfile.write('\n'.join(str(line) for line in lines))
myfile.write('\n')
或者,对于一个列表,去掉*
并执行我上面所做的操作。
编辑: @Arafangion 是对的,您可能应该只使用b
而不是t
来写入您的文件。 这样,您就不必担心不同平台处理换行符的不同方式。
那里有很多错误。
当您迭代“文本中的行”时,由于这些错误,您真正在做的是迭代函数中的参数,因为“文本”代表您的所有参数。 这就是'*'的作用。 (至少,在这种情况下。严格来说,它迭代所有剩余的参数 - 请阅读文档)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.