以正确的方式用python编写文件

以正确的方式用python编写文件,python,file,file-io,Python,File,File Io,我有一个函数,可以将列表的内容写入文本文件。对于列表中的每个元素,它都将元素写入文本文件,每个元素都有自己的新行 def write_file(filename): name_file = filename filename = open(name_file, 'w') for line in list: if line == len(list)-1: filename.write(line) else:

我有一个函数,可以将列表的内容写入文本文件。对于列表中的每个元素,它都将元素写入文本文件,每个元素都有自己的新行

def write_file(filename):
    name_file = filename
    filename = open(name_file, 'w')

    for line in list:
        if line == len(list)-1:
            filename.write(line)
        else:
            filename.write(line+'\n')
    filename.close()
我倾向于注意到一个错误,即在文本文件的最后一行生成一个空换行符,我想知道我是否正确地编写了该文件

假设我的列表包含[1,2,3,4],将其写入文本文件会给我

1
2
3
4
#in some cases, an empty newline is printed here at the end

我不知道如何检查write函数是否由于“\n”而在最后生成了一个额外的行,因此如果有人能给我一些反馈,我将不胜感激。

与其多次写入缓冲区,不如执行一次
。join
,并将结果写入一次:

with open(filename, 'w') as fp:
    fp.write('\n'.join(your_list))
试一试

在您的示例中,
line==len(list)-1:
您只是在比较一个int与list-1的长度,而不是列表中的最后一项

虽然这仍然不是完美的,因为如果列表中有重复项,例如
[1,2,3,5,2]
,则可能会遇到问题。在这种情况下,最好使用
join
for i
语句

thefile = open('test.txt', 'w')
我会使用一个循环:

for item in thelist:
  thefile.write("%s\n" % item)

如果要从字符串列表写入文件,可以使用以下代码段:

def write_file(filename):
    with open(filename, 'w') as f:
        f.write('\n'.join(lines))


lines = ["hi", "hello"]

write_file('test.txt')

更新:

他指出了一个误解。最后一行似乎不应该有任何新行字符。这可以通过使用
enumerate()
提供行计数、检查打印时是否是最后一行并相应地更改行结束字符来纠正:

def write_file(filename, data):
    with open(filename, 'w') as f:
        for line_no, item in enumerate(data, 1):
            print(item, file=f, end='\n' if line_no < len(data) else '')
原始答案:

为什么不直接使用并指定输出文件呢

def write_file(filename, data):
    with open(filename, 'w') as f:
        for item in data:
            print(item, file=f)
或者更简洁地说:

def write_file(filename, data):
    with open(filename, 'w') as f:
        print(*data, file=f, sep='\n')
如果您有一个较大的列表,则首选前者,因为后者需要解压列表以将其内容作为参数传递给
print()

这两个选项将自动为您处理新行字符

在带有语句的
中打开文件也会帮您关闭文件


您还可以使用
“\n”.join()
来加入列表中的项目。同样,这对于较小的列表也是可行的。另外,您的示例显示了一个整数列表-
print()
不要求首先将其参数转换为字符串,就像
join()

一样,您不应该对列表中的行使用
,这里,
list
不应该用于列表名称,因为单词“list”是python的保留字。这是一个关键词。您可以执行
myLst=list(“abcd”)
以获得类似
myLst=[“a”、“b”、“c”、“d”]

关于问题的解决方案,我建议您使用
with
方法,以防忘记关闭文件。这样,您就不必关闭文件。只要退出缩进就可以了。以下是我如何解决您的问题:

#I just made a list using list comprehension method to avoid writing so much manually.
myLst=list("List number {}".format(x) for x in range(15))
#Here is where you open the file
with open ('testfile.txt','w') as file:
    for each in myLst:
        file.write(str(each))
        if each!=myLst[len(myLst)-1]:
            file.write('\n')
        else:
            #this "continue" command tells the python script to continue on to the next loop.
            #It basically skips the current loop.
            continue

我希望我能有所帮助。

如果line==len(list)-1:
真的没有意义。它不会测试
line
是否是列表的最后一个元素(这似乎是您的意图)。相反,它测试列表元素本身是否比列表长度小1,这有点无意义?在上下文中,它似乎是一个包含列表的全局变量,这是双重可怕的——一个不必要的全局变量,它使用内置的名称(使用“list”作为列表的名称总是一个坏主意)。
如果line==list[-1]:
。。。但是如果列表看起来像
[1,2,4,3,4]
,该怎么办?此代码将以不同的方式对待前4个,而不是之前的2个和之后的3个。你似乎意识到了这个问题——那么为什么要发布错误代码作为答案呢?是的,我更新了我的答案来指出这一点。尽管根据OP的[1,2,3,4]列表,它还是可以工作的。但你是对的,这并不理想。如果你想尽可能多地修复OP的代码,最好使用
enumerate()
,或者先循环
list[:-1']
(什么是
list
?——另一个应该被捕获的错误),然后处理主循环后的最后一行。啊,是的,忘记重定向打印了吗stream@hjpotter92:
print()。(OP示例是整数的列表)+1,但OP不希望最后一行有换行符(这是否是一个好问题是另一个问题)。两种方法都有最后一个换行符。第二个问题可以用
end=''
@JohnColeman来补救:在重读这个问题之后,我认为你可能是对的。我阅读的方式是,OP声明有一个“空换行符”,即文件末尾有额外的空行。OP的代码掩盖了这一点,所以我不知道该怎么想。
def write_file(filename, data):
    with open(filename, 'w') as f:
        print(*data, file=f, sep='\n')
#I just made a list using list comprehension method to avoid writing so much manually.
myLst=list("List number {}".format(x) for x in range(15))
#Here is where you open the file
with open ('testfile.txt','w') as file:
    for each in myLst:
        file.write(str(each))
        if each!=myLst[len(myLst)-1]:
            file.write('\n')
        else:
            #this "continue" command tells the python script to continue on to the next loop.
            #It basically skips the current loop.
            continue