繁体   English   中英

如何在 Python3 中用换行符将列表写入文件

[英]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来写入您的文件。 这样,您就不必担心不同平台处理换行符的不同方式。

那里有很多错误。

  1. 你的缩进搞砸了。
  2. save_to_file 中的 'text' 属性指的是所有参数,而不仅仅是特定参数。
  3. 您正在使用“文本模式”,这也令人困惑。 请改用二进制模式,以便您对 '\\n' 具有一致且定义的含义。

当您迭代“文本中的行”时,由于这些错误,您真正在做的是迭代函数中的参数,因为“文本”代表您的所有参数。 这就是'*'的作用。 (至少,在这种情况下。严格来说,它迭代所有剩余的参数 - 请阅读文档)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM