以正确的方式用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