2011-09-24 65 views
4

我想避免在python文本文件的末尾写入换行符。这是一个我有很多问题,我相信可以很容易地修复。以下是一个示例:避免在文件结尾处换行 - Python

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

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

回答

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

非常感谢!尼斯和紧凑也... – bac

1

在我看来,一个文本文件由文本行组成。线以换行序列结束,其确切的细节是特定于平台的。因此,一个正确的文本文件每行必须总是包含1个换行序列。

无论如何,你可以通过不同的方式处理最后一行,或者在内存中构建整个文件并将其写为二进制数据,注意省略最后的一个或两个字节,具体取决于您的平台换行顺序的确切格式。

1

下面是一个避免创建中间字符串的解决方案,当列表的大小很大时这将会很有帮助。不必担心文件末尾的换行符,它会在之前的新行打印行,第一行除外,第一行在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) 
+0

最后一个循环的缩进是否正确? – 9000

+0

是;这是一个小窍门;两个循环都在同一个迭代器上循环;由于内循环在外循环运行第二次迭代之前耗尽了迭代器,所以外循环至多运行一次;如果列表为空,则两个循环都不会运行! – SingleNegationElimination

+0

使用listiter.next()而不是写只能执行一次的outerloop会更清楚吗? –

1

如果你有,你不想转换成一个字符串join()很长的名单,好老的标志varaibles前来救援:

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) 
+0

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