避免在文件末尾添加换行符 - Python

4

我希望在Python中避免向文本文件末尾写入换行符。这是我经常遇到的问题,我相信很容易解决。以下是一个示例:

fileout = open('out.txt', 'w')
list = ['a', 'b', 'c', 'd']
for i in list:
    fileout.write('%s\n' % (i))

这会在文件末尾打印一个 \n 字符。我该如何修改我的循环以避免这种情况?

4个回答

8
fileout = open('out.txt', 'w')
list = ['a', 'b', 'c', 'd']
fileout.write('\n'.join(list))

2
这里有一个解决方案,避免了创建中间字符串的问题,这对于列表大小较大时非常有用。它不必担心文件末尾的换行符,而是将换行符放在要打印的行之前,除了第一行,它在for循环外处理。
fileout = open('out.txt', 'w')
mylist = ['a', 'b', 'c', 'd']
listiter = iter(mylist)
for first in listiter:
    fileout.write(first)
    for i in listiter:
        fileout.write('\n')
        fileout.write(i)

是的,这有点棘手;两个循环都在同一个迭代器上循环;由于内部循环在外部循环运行第二次迭代之前耗尽了迭代器,因此外部循环最多只运行一次;如果列表为空,则两个循环都不会运行! - SingleNegationElimination
使用listiter.next()会不会更清晰一些,而不是编写只执行一次的外部循环呢? - Winston Ewert
但是如果列表为空会发生什么?你最终需要以某种方式捕获StopIteration。使用for循环而不是try、next、except StopIteration似乎不那么奇怪。 - SingleNegationElimination

1

如果您有非常长的列表,不想使用join()将其转换为一个字符串,那么好老的标志变量就可以派上用场:

is_first_line = True
for s in my_list:
  if is_first_line:
    # see, no write() in this branch
    is_first_line = False 
  else:
    # we've just written a line; add a newline
    output.write('\n')
  output.write(s)

谢谢!是的,我经常处理长文件,所以这会很有帮助。 - bac

1
在我看来,文本文件由文本行组成。每行都以换行序列终止,其确切细节因平台而异。因此,正确的文本文件必须始终每行包含恰好1个换行序列。
无论如何,您可能可以通过将最后一行处理不同或在内存中构建整个文件并将其作为二进制数据写入,注意省略最后一个或两个字节(具体取决于您平台的换行序列的确切格式)来解决此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接