Python技术问询:如何将多组列表按列写入CSV文件并保存到目录
解决Python中按列写入CSV的问题
别担心,我帮你搞定这个问题!你遇到的核心是数据转置的问题——原来的代码是把每个子列表作为一行写入,但你需要把每个原列表作为一列,这就需要先把你的数据“转过来”,再写入CSV。
核心思路:转置你的列表数据
Python内置的zip()函数可以帮你轻松完成转置:它会把多个列表的对应位置元素打包成元组,这样原本的“列数据”就变成了“行数据”,再用writerows()写入就能得到你想要的列格式。
如果你的列表长度不一致,还可以用itertools.zip_longest()来保留所有元素,用指定值填充空缺的位置(比如空字符串'')。
完整代码示例
情况1:所有列表长度一致
import csv import os # 你的原始列表 list1 = ['a', 'b', 'c', 'd'] list2 = ['e', 'f', 'g', 'h'] list3 = ['i', 'j', 'k', 'l'] # 指定保存的目录和文件名 save_directory = './my_saved_csvs' # 相对路径,也可以用绝对路径比如'/Users/yourname/Documents/csv_files' file_name = 'column_data.csv' full_file_path = os.path.join(save_directory, file_name) # 确保保存目录存在,不存在则创建 os.makedirs(save_directory, exist_ok=True) # 转置数据:把列转成行 transposed_data = zip(list1, list2, list3) # 写入CSV文件 with open(full_file_path, 'w', newline='') as csv_file: writer = csv.writer(csv_file) writer.writerows(transposed_data)
情况2:列表长度不一致(保留所有元素)
如果你的列表长度不同,比如list1有4个元素,list2有5个,用zip_longest来处理:
import csv import os from itertools import zip_longest list1 = ['a', 'b', 'c', 'd'] list2 = ['e', 'f', 'g', 'h', 'm'] # 比其他列表多一个元素 list3 = ['i', 'j', 'k'] # 比其他列表少一个元素 save_directory = './my_saved_csvs' file_name = 'column_data_with_fill.csv' full_file_path = os.path.join(save_directory, file_name) os.makedirs(save_directory, exist_ok=True) # 用空字符串填充空缺的位置,也可以改成None或者其他值 transposed_data = zip_longest(list1, list2, list3, fillvalue='') with open(full_file_path, 'w', newline='') as csv_file: writer = csv.writer(csv_file) writer.writerows(transposed_data)
代码说明
- 转置数据:
zip(list1, list2, list3)会生成类似('a','e','i'), ('b','f','j'), ...的元组,每个元组对应CSV的一行,最终就实现了list1是第一列、list2是第二列的效果。 - 指定目录保存:
- 用
os.path.join()拼接目录和文件名,避免手动拼接路径时出现斜杠错误(比如Windows和Linux的路径分隔符不同)。 os.makedirs(save_directory, exist_ok=True)会自动创建不存在的目录,exist_ok=True确保目录已存在时不会抛出错误。
- 用
- 自动关闭文件:使用
with语句打开文件,不需要手动调用csv_file.close(),Python会在代码块结束后自动关闭文件,更安全。
最终CSV效果
运行第一个代码后,打开CSV文件会看到:
a,e,i
b,f,j
c,g,k
d,h,l
完全符合你想要的按列排列的需求!
内容的提问来源于stack exchange,提问作者Terry Salaga




