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

toiithl6  于 2023-03-11  发布在  Python
关注(0)|答案(3)|浏览(306)

我尝试用Python 3将一个数组(list?)写入文本文件。

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给出“类型错误:must be str,not list”,我认为这是因为Python 2和Python3之间的变化。在换行符上获取每个元素时,我遗漏了什么?
编辑:感谢@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在文件的末尾放入了最后一个换行符。

oiopk7p5

oiopk7p51#

myfile.close--在使用with的地方去掉它。with自动关闭myfile,并且当你不使用with时,你必须像调用close()一样调用close,这样它才能做任何事情。

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

e7arh2l6

e7arh2l62#

这里面有很多错误。
1.你的压痕搞砸了。
1.保存_to_file中的“text”属性引用所有参数,而不仅仅是特定参数。
1.您使用的是“文本模式”,这也会引起混淆。请改用二进制模式,以便对“\n”具有一致且明确的含义。
当你迭代“文本中的行”时,由于这些错误,你实际上是在迭代函数中的参数,因为“文本”代表了你所有的参数。这就是“*”所做的。(至少在这种情况下。严格地说,它迭代了所有剩余的参数--请阅读文档)。

bihw5rsg

bihw5rsg3#

我是python的高手,但我找到了这个解决方案,并且为我工作。通过使用“f”字符串,列表中的每一项都可以写入文本文件的新行中。
我的列表=['a','b','c']
打开文件(“/路径/到/文件名. txt”,模式=“w”,编码=“utf-8”)作为myfile:
对于my_list中的项目:

myfile.write(f"\n{item}")

输出:
项目a
B
(c)秘书长的报告

相关问题