writelines() 方法將字串序列(列表、元組、產生器等可迭代物件)一次寫入檔案。與 write() 不同,它不自動添加換行符,每個元素需自行包含 \n。適合批量寫入已格式化好的行資料。
fileObject.writelines(sequence)
sequence:任何可迭代物件,產出字串(或位元組)。None)。
lines = ['Line 1\n', 'Line 2\n', 'Line 3\n']
with open('foo.txt', 'w') as f:
f.writelines(lines)
with open('numbers.txt', 'w') as f:
f.writelines(f'{i}\n' for i in range(100)) # 寫入 0-99,無需建立完整列表
with open('foo.txt', 'r+') as f:
f.seek(0, 2) # 移至末尾
f.writelines(['Line 6\n', 'Line 7\n'])
#!/usr/bin/python
with open('foo.txt', 'w+') as f:
print("Name:", f.name)
# 初始 5 行
for i in range(1, 6):
f.write(f'Line {i}\n')
# 批量追加 2 行
seq = ['Line 6\n', 'Line 7\n']
f.seek(0, 2)
f.writelines(seq)
# 從頭讀回驗證
f.seek(0)
for i, line in enumerate(f):
print(f"Line No {i} - {line.rstrip()}")
# 輸出:
# Name: foo.txt
# Line No 0 - Line 1
# Line No 1 - Line 2
# Line No 2 - Line 3
# Line No 3 - Line 4
# Line No 4 - Line 5
# Line No 5 - Line 6
# Line No 6 - Line 7
| 特性 | write(str) | writelines(seq) |
|---|---|---|
| 參數型別 | 單一字串 | 字串可迭代物件 |
| 自動換行 | 否 | 否 |
| 記憶體效率 | 單次寫入 | 可配合產生器流式寫入 |
| 適用場景 | 零散寫入、格式化字串 | 已備妥行列表、大量資料流式輸出 |
# 錯誤:以為 writelines 會自動加換行
f.writelines(['a', 'b', 'c']) # 檔案內容變成 'abc',非三行
# 正確:元素自帶換行
f.writelines(['a\n', 'b\n', 'c\n'])
# 或
f.write('\n'.join(['a','b','c']) + '\n')
def chunked_write(filepath, data_iter, chunk_size=8192):
"""將大量資料分塊寫入,避免記憶體暴漲"""
with open(filepath, 'w') as f:
buffer = []
for line in data_iter:
buffer.append(line)
if len(buffer) >= chunk_size:
f.writelines(buffer)
buffer.clear()
if buffer:
f.writelines(buffer)
writelines() 是批量寫入多行字串的高效方法,核心要點:元素需自帶換行符、支援任意可迭代物件(含產生器)、無回傳值。配合 seek() 可實現檔案任意位置的批量插入/覆寫。