【问题标题】:How to write a list to a file with newlines in Python3如何在 Python3 中使用换行符将列表写入文件
【发布时间】:2011-08-21 13:59:31
【问题描述】:

我正在尝试使用 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”,但似乎写入操作是在一次操作中转储数组。问题类似于How to write list of strings to file, adding newlines?,但语法看起来像是针对 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-list 类型错误;我一直在想我需要告诉定义它正在获取传递给它的列表/数组,并且仅说明“test”将是一个字符串。)一旦我将其更改为文本和使用 myfile.write 和 join,附加的 \n 放在文件末尾的最后一个换行符中。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

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

    【讨论】:

    • 无论您使用的是python3还是python2,我都建议您始终使用with。这是常见的语法。
    • 我建议您将我的部分(或全部)答案合并到这个答案中,那么这个问题应该有一个“好的答案”,请注意这里的“文本”是指 arguments,所以它总是一个列表。
    • 如果您需要 2.5 或更早版本的兼容性,您不能总是在 PYthon 2 中使用 with
    • Python 2.5 或更早版本已经很老了,但是是的,它仍然在某些地方使用。至于 utf-8 编码,它与“文本模式”有什么关系?这只要求操作系统自动将他的 '\n' 修改为 '\r\n' 或其他任何内容。
    • 感谢您的解释。我正在努力学习这门语言,并希望了解它为什么不起作用,您的回答对我都有帮助。
    【解决方案2】:

    那里有很多错误。

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

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

    【讨论】:

    • 我认为缩进只是问题中的代码格式错误,而不是原始代码。
    • 刚刚看到;想知道它是如何在不正确的缩进下运行的 :-) 是的,它来自此处发布的问题,实际代码已正确缩进。我应该抓住它。
    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多