鱼C论坛

 找回密码
 立即注册
查看: 1806|回复: 18

[已解决]python csv文件问题

[复制链接]
发表于 2023-5-29 15:51:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个是什么问题要怎么解决
最佳答案
2023-5-29 18:55:48
urbanlife 发表于 2023-5-29 16:12
import csv

score1 = [['考号','程序设计','细胞生物','生理学'],[10153450101,72,96,88],[1015345010 ...


你的代码的问题是由于你试图从空列表中取值导致的。问题在这部分代码:
with open('score.csv','r') as score:
    reader = csv.reader(score)
    print(list(reader))
    s1 = [row[1] for row in list(reader)]
    s2 = [row[2] for row in list(reader)]
    s3 = [row[3] for row in list(reader)]

你调用了 list(reader) 三次。第一次调用打印了整个列表,而在其后两次调用中,你试图从这个已经被遍历完的reader对象中获取元素,这就是为什么s1、s2和s3都是空的,因为在这时reader对象已经没有任何数据了。

换句话说,reader对象是一个迭代器,当你遍历它一次后,你就不能再从中获取数据了。

你可以像下面这样修改你的代码:
with open('score.csv','r') as score:
    reader = csv.reader(score)
    all_rows = list(reader) # 只调用一次list(reader)
    print(all_rows)
    s1 = [row[1] for row in all_rows]
    s2 = [row[2] for row in all_rows]
    s3 = [row[3] for row in all_rows]
现在,s1、s2和s3将包含你想要的数据,因为我们只对reader对象调用一次 list() 函数,以获取其所有行。这样,当我们进行后续处理时,就可以从这个列表中获取数据了。



修改后的完整代码:
import csv

score1 = [['考号','程序设计','细胞生物','生理学'],[10153450101,72,96,88],[10153450102,68,88,73],[10153450103,63,63,66],[10153450104,95,64,65],[10153450105,89,88,57],[10153450106,77,87,77],[10153450107,67,64,97],[10153450108,44,99,64],[10153450109,82,73,75],[10153450110,79,78,85]]

with open ('score.csv','w',newline='') as score:
    writer = csv.writer(score)
    for row in score1:
        writer.writerow(row)

with open('score.csv','r') as score:
    reader = csv.reader(score)
    all_rows = list(reader) # 只调用一次list(reader)
    s1 = [row[1] for row in list(all_rows)]
    s2 = [row[2] for row in list(all_rows)]
    s3 = [row[3] for row in list(all_rows)]
S = [s1,s2,s3]
for s in S:
    Sum = 0
    print('{}:'.format(s[0]),end='')
    for i in s[1:]:
        Sum += int(i)
QQ截图20230529155114.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-29 16:05:56 | 显示全部楼层
csv.writer 第一个参数是文件句柄  第二个参数是写入内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-29 16:06:46 | 显示全部楼层
你发一下文本代码  以便帮忙测试,你发图片  都没法测试的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-29 16:08:17 | 显示全部楼层
wp231957 发表于 2023-5-29 16:05
csv.writer 第一个参数是文件句柄  第二个参数是写入内容

你好,可以在细说一下吗,我没用看的很懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-29 16:12:09 | 显示全部楼层
wp231957 发表于 2023-5-29 16:06
你发一下文本代码  以便帮忙测试,你发图片  都没法测试的

import csv

score1 = [['考号','程序设计','细胞生物','生理学'],[10153450101,72,96,88],[10153450102,68,88,73],[10153450103,63,63,66],[10153450104,95,64,65],[10153450105,89,88,57],[10153450106,77,87,77],[10153450107,67,64,97],[10153450108,44,99,64],[10153450109,82,73,75],[10153450110,79,78,85]]

with open ('score.csv','w',newline='') as score:
    writer = csv.writer(score)
    for row in score1:
        writer.writerow(row)

with open('score.csv','r') as score:
    reader = csv.reader(score)
    print(list(reader))
    s1 = [row[1] for row in list(reader)]
    s2 = [row[2] for row in list(reader)]
    s3 = [row[3] for row in list(reader)]
S = [s1,s2,s3]
for s in S:
    Sum = 0
    print('{}:'.format(s[0]),end='')
    for i in s[1:]:
        Sum += int(i)
        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-29 16:16:40 | 显示全部楼层
urbanlife 发表于 2023-5-29 16:12
import csv

score1 = [['考号','程序设计','细胞生物','生理学'],[10153450101,72,96,88],[1015345010 ...
import csv

score1 = [['考号','程序设计','细胞生物','生理学'],[10153450101,72,96,88],[10153450102,68,88,73],[10153450103,63,63,66],[10153450104,95,64,65],[10153450105,89,88,57],[10153450106,77,87,77],[10153450107,67,64,97],[10153450108,44,99,64],[10153450109,82,73,75],[10153450110,79,78,85]]

with open ('score.csv','w',newline='') as score:
    writer = csv.writer(score)
    for row in score1:
        writer.writerow(row)

with open('score.csv','r') as score:
    reader = list(csv.reader(score))
    #print("***",list(reader))
    s1 = [row[1] for row in (reader)]
    s2 = [row[2] for row in (reader)]
    s3 = [row[3] for row in (reader)]
S = [s1,s2,s3]
#print(S)
for s in S:
    Sum = 0
    print('{}:'.format(s[0]),end='')
    for i in s[1:]:
        Sum += int(i)
        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-29 16:17:37 | 显示全部楼层
urbanlife 发表于 2023-5-29 16:12
import csv

score1 = [['考号','程序设计','细胞生物','生理学'],[10153450101,72,96,88],[1015345010 ...

二楼可以忽略了,是错的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-29 17:05:32 | 显示全部楼层
先不看你的代码有没有问题,但是你的脚本文件不能命名成跟你需要导入的库一样,不然会导致没法导入你所需的库
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-29 17:10:33 | 显示全部楼层
isdkz 发表于 2023-5-29 17:05
先不看你的代码有没有问题,但是你的脚本文件不能命名成跟你需要导入的库一样,不然会导致没法导入你所需的 ...

你好我没有在我的代码里发现这个问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-29 17:13:07 | 显示全部楼层
urbanlife 发表于 2023-5-29 17:10
你好我没有在我的代码里发现这个问题啊

你的脚本名字是 csv.py,你给它改成别的名字,不要用 csv.py 作为名字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-29 18:47:45 | 显示全部楼层
脚本名称不要用csv,不然导入的csv就是脚本自己
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-29 18:49:44 | 显示全部楼层
isdkz 发表于 2023-5-29 17:13
你的脚本名字是 csv.py,你给它改成别的名字,不要用 csv.py 作为名字

好的,谢谢纠正这个错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-29 18:50:22 | 显示全部楼层
isdkz 发表于 2023-5-29 17:13
你的脚本名字是 csv.py,你给它改成别的名字,不要用 csv.py 作为名字

可以帮我看看其他哪里有问题吗???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-29 18:50:35 | 显示全部楼层
urbanlife 发表于 2023-5-29 18:49
好的,谢谢纠正这个错误

不客气,问题解决的话给个最佳答案支持一下呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-29 18:51:43 | 显示全部楼层
urbanlife 发表于 2023-5-29 18:50
可以帮我看看其他哪里有问题吗???

我执行一下看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-29 18:54:52 | 显示全部楼层
歌者文明清理员 发表于 2023-5-29 18:47
脚本名称不要用csv,不然导入的csv就是脚本自己

好的谢谢,楼上的人已经纠正了我这个错误,但是也谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-29 18:55:48 | 显示全部楼层    本楼为最佳答案   
urbanlife 发表于 2023-5-29 16:12
import csv

score1 = [['考号','程序设计','细胞生物','生理学'],[10153450101,72,96,88],[1015345010 ...


你的代码的问题是由于你试图从空列表中取值导致的。问题在这部分代码:
with open('score.csv','r') as score:
    reader = csv.reader(score)
    print(list(reader))
    s1 = [row[1] for row in list(reader)]
    s2 = [row[2] for row in list(reader)]
    s3 = [row[3] for row in list(reader)]

你调用了 list(reader) 三次。第一次调用打印了整个列表,而在其后两次调用中,你试图从这个已经被遍历完的reader对象中获取元素,这就是为什么s1、s2和s3都是空的,因为在这时reader对象已经没有任何数据了。

换句话说,reader对象是一个迭代器,当你遍历它一次后,你就不能再从中获取数据了。

你可以像下面这样修改你的代码:
with open('score.csv','r') as score:
    reader = csv.reader(score)
    all_rows = list(reader) # 只调用一次list(reader)
    print(all_rows)
    s1 = [row[1] for row in all_rows]
    s2 = [row[2] for row in all_rows]
    s3 = [row[3] for row in all_rows]
现在,s1、s2和s3将包含你想要的数据,因为我们只对reader对象调用一次 list() 函数,以获取其所有行。这样,当我们进行后续处理时,就可以从这个列表中获取数据了。



修改后的完整代码:
import csv

score1 = [['考号','程序设计','细胞生物','生理学'],[10153450101,72,96,88],[10153450102,68,88,73],[10153450103,63,63,66],[10153450104,95,64,65],[10153450105,89,88,57],[10153450106,77,87,77],[10153450107,67,64,97],[10153450108,44,99,64],[10153450109,82,73,75],[10153450110,79,78,85]]

with open ('score.csv','w',newline='') as score:
    writer = csv.writer(score)
    for row in score1:
        writer.writerow(row)

with open('score.csv','r') as score:
    reader = csv.reader(score)
    all_rows = list(reader) # 只调用一次list(reader)
    s1 = [row[1] for row in list(all_rows)]
    s2 = [row[2] for row in list(all_rows)]
    s3 = [row[3] for row in list(all_rows)]
S = [s1,s2,s3]
for s in S:
    Sum = 0
    print('{}:'.format(s[0]),end='')
    for i in s[1:]:
        Sum += int(i)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-29 18:55:56 | 显示全部楼层
urbanlife 发表于 2023-5-29 18:54
好的谢谢,楼上的人已经纠正了我这个错误,但是也谢谢你

给他最佳吧,另外你代码没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-30 08:00:53 | 显示全部楼层
urbanlife 发表于 2023-5-29 18:50
可以帮我看看其他哪里有问题吗???

难道六楼代码不对???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表