Python中writelines()传入字符串未按预期输出的技术疑问
writelines('aaa')没有生成三行单独的'a'? 这完全是刻意设计的行为,不是Python的bug,咱们一步步拆解清楚:
首先看官方文档的说明(你已经贴出来了):
writelines(sequence_of_strings) -> None. Write the strings to the file. Note that newlines are not added. The sequence can be any iterable object producing strings. This is equivalent to calling write() for each string.
重点要抓住两个核心点:
writelines会迭代传入的可迭代对象,对每个元素调用write()- 它不会自动添加换行符
为什么传'aaa'得到的是连续的'aaa'?
字符串'aaa'本身是可迭代对象,迭代它会得到单个字符'a'、'a'、'a'。所以调用f.writelines('aaa')等价于连续调用三次f.write('a')——而write('a')只会写入字符本身,不会加换行,最终结果自然是三个'a'连在一起。
为什么list('aaa')也达不到你的预期?
把'aaa'转成列表['a','a','a'],本质上和直接传字符串没区别:writelines还是会依次写入每个'a',同样没有换行符,结果还是连续的'aaa'。
怎么得到三行单独的'a'?
如果你想要每行一个'a',需要让序列里的每个元素都包含换行符。比如:
- 生成带换行的字符串生成器:
f.writelines('a\n' for _ in range(3)) - 直接传入带换行的列表:
f.writelines(['a\n', 'a\n', 'a\n']) - 或者遍历原字符串时追加换行:
f.writelines(c + '\n' for c in 'aaa')
为什么要这么设计?
这个设计的核心是把控制权交给用户:writelines只负责批量写入你提供的字符串,不做额外的换行处理。这样既可以处理已经包含换行的文本(比如读取另一个文件的行列表),也可以处理不需要换行的连续文本,灵活性更高。如果它自动添加换行,反而会给不需要换行的场景带来麻烦。
内容的提问来源于stack exchange,提问作者cgsdfc

