以正确的方式在python中编写文件

时间:2017-09-20 11:19:49

标签: 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:
            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

由于' \ n'我不知道如何检查写功能是否在最后产生额外的一行。所以,如果有人能给我一些反馈,我会很感激。

6 个答案:

答案 0 :(得分:6)

不是多次写入缓冲区,而是执行.join,并将结果写一次:

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

答案 1 :(得分:4)

<强>更新

@John Coleman指出了一个误解。似乎最后一行不应该有任何换行符。这可以通过使用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 '')

这不像使用\n。join(data)`那样优雅,但它对于大型列表来说是内存效率。

join()的替代方案是:

def write_file(filename, data):
    with open(filename, 'w') as f:
        print(*data, file=f, sep='\n', end='')

原始回答:

为什么不简单地使用print()并指定输出文件?

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()

两个选项都会自动为您处理换行符。

with语句中打开文件也会为您关闭文件。

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

答案 2 :(得分:0)

尝试

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

    for line in list:
        if line == list[-1]:
            filename.write(line)
        else:
            filename.write(line+'\n')
    filename.close()

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

虽然这仍然不完美,因为如果您在列表中有重复项目(例如[1,2,3,5,2])可能会遇到问题,那么最好使用join或{{1声明。

答案 3 :(得分:0)

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

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


lines = ["hi", "hello"]

write_file('test.txt')

答案 4 :(得分:0)

你不应该在这里使用for line in listlist不应该用于列表名称,因为单词“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

我希望我能提供帮助。

答案 5 :(得分:-1)

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

我使用循环:

sc.textFile("file:///d:/data.txt").map(x => x.split("\n")).flatMap(x => x).map(x => isName(x)).collect