如何用Python将两个列表写入CSV?遇izip导入错误及文件清空问题
解决两个列表写入CSV的常见问题
嘿,我来帮你搞定这两个CSV写入的小麻烦~
1. 关于izip的ImportError错误
这个问题其实是Python版本差异搞的鬼:
- 在Python 2里,
zip()会返回一个列表,而itertools.izip()返回迭代器(更省内存); - 但到了Python 3,
zip()本身就已经返回迭代器了,itertools里不再有izip这个函数啦!
如果你的代码需要兼容Python 2和3,可以这么写兼容代码:
try: from itertools import izip except ImportError: # Python 3下直接用zip替代izip izip = zip
要是只在Python 3环境运行,直接用zip()就好,功能和原来的izip完全一样~
2. 使用zip方案时原CSV被清空的问题
这大概率是你打开文件的模式用错了!
- 如果你用了
open('file.csv', 'w'),'w'模式会直接截断并清空原有文件,然后写入新内容; - 如果你想追加内容到现有CSV末尾,要改用
'a'模式; - 如果你想保留原内容并添加新列/行,得先读取原文件内容,合并后再写入。
给你几个实用的示例:
示例1:创建新CSV,将两个列表写入两列
import csv col1 = ["apple", "banana", "cherry"] col2 = [10, 20, 30] # 'w'模式适合创建新文件,newline=''避免Windows下多空行 with open('fruits.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile) # 遍历zip后的每一组,写入一行 for item in zip(col1, col2): writer.writerow(item)
示例2:追加内容到现有CSV末尾
import csv new_col1 = ["date", "orange"] new_col2 = [40, 50] # 'a'模式是追加,不会清空原有内容 with open('fruits.csv', 'a', newline='') as csvfile: writer = csv.writer(csvfile) for item in zip(new_col1, new_col2): writer.writerow(item)
示例3:给原CSV添加新列(保留原有内容)
如果要把两个列表作为新的列加到原CSV的每一行:
import csv # 先读取原CSV的所有内容 original_rows = [] with open('fruits.csv', 'r') as csvfile: reader = csv.reader(csvfile) original_rows = list(reader) # 准备要添加的新列数据 new_col1 = ["fresh", "fresh", "fresh", "fresh"] new_col2 = ["yes", "yes", "yes", "yes"] # 合并原行和新列(要保证新列长度和原行数一致哦) for idx in range(len(original_rows)): original_rows[idx].append(new_col1[idx]) original_rows[idx].append(new_col2[idx]) # 写回文件(这里用'w'模式,因为我们已经把原内容读出来合并了) with open('fruits.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerows(original_rows)
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

