Linux环境下终端与CSV输出列表交集结果不一致问题
问题排查:为什么CSV文件只保留了最后一个交集元素?
问题原因
兄弟,你这问题出在循环的执行逻辑上!你看:
- 当你用
for q in a:循环打印时,每次迭代都会输出当前的q,所以终端能看到所有交集元素(67、4、6,集合是无序的,顺序可能随机)。 - 但你写入文件的代码是在循环结束后才执行的,这时候变量
q已经是循环最后一次迭代的那个值(也就是6),所以自然只把最后一个元素写进文件了。
解决方案
给你三种靠谱的解决办法,按需选:
1. 循环内逐个写入(适合每行一个元素)
直接把写入操作放到循环里,每次迭代都把当前元素写入文件,记得加换行符:
import csv s1=[4,6,0,23,8,67,5] s2=[2,3,9,6,7,67,4] a=list(set(s1)&set(s2)) for q in a: print(q) # 用with语句自动管理文件,避免忘记关闭 with open('fm/state/csv/test', 'w') as f: for q in a: f.write(f"{q}\n")
2. 一次性写入所有元素(CSV规范格式)
如果要生成标准的CSV行(元素用逗号分隔),可以把列表转成逗号连接的字符串一次性写入:
import csv s1=[4,6,0,23,8,67,5] s2=[2,3,9,6,7,67,4] a=list(set(s1)&set(s2)) for q in a: print(q) with open('fm/state/csv/test', 'w') as f: # 把每个元素转成字符串后用逗号连接,再加换行符 f.write(','.join(map(str, a)) + '\n')
3. 用csv模块的writer(最规范的CSV写法)
既然你已经导入了csv模块,用它来处理CSV写入是最专业的,能自动处理各种边界情况:
import csv s1=[4,6,0,23,8,67,5] s2=[2,3,9,6,7,67,4] a=list(set(s1)&set(s2)) for q in a: print(q) # newline=''避免Windows下出现多余空行 with open('fm/state/csv/test', 'w', newline='') as f: writer = csv.writer(f) # 写入一行,元素自动用逗号分隔 writer.writerow(a) # 如果想每个元素单独占一行,换成下面这句: # writer.writerows([[item] for item in a])
内容的提问来源于stack exchange,提问作者amb_ols
相关产品推荐
相关产品推荐

