Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用csv模块有效读取文件_Python_File_Csv_Text - Fatal编程技术网

Python:使用csv模块有效读取文件

Python:使用csv模块有效读取文件,python,file,csv,text,Python,File,Csv,Text,我最近刚开始学习csv模块。假设我们有这个CSV文件: John,Jeff,Judy, 21,19,32, 178,182,169, 85,74,57, 我们想要读取这个文件并创建一个包含名称(作为键)和每列总数(作为值)的字典。因此,在这种情况下,我们最终将得到: d = {"John" : 284, "Jeff" : 275, "Judy" : 258} 因此,我写了这段代码,它显然工作得很好,但我并不满意,我想知道是否有人知道更好或更高效/优雅的方法。因为里面有太多的行:D(或者我们可

我最近刚开始学习csv模块。假设我们有这个CSV文件:

John,Jeff,Judy,
21,19,32,
178,182,169,
85,74,57,
我们想要读取这个文件并创建一个包含名称(作为键)和每列总数(作为值)的字典。因此,在这种情况下,我们最终将得到:

d = {"John" : 284, "Jeff" : 275, "Judy" : 258}
因此,我写了这段代码,它显然工作得很好,但我并不满意,我想知道是否有人知道更好或更高效/优雅的方法。因为里面有太多的行:D(或者我们可以用一种方法把它概括一下,也就是说,我们不知道有多少个字段)

d={}
导入csv
打开(“file.csv”)作为f:
readObject=csv.reader(f)
totals0=0
总计1=0
总计2=0
总计3=0
currentRowTotal=0
对于readObject中的行:
currentRowTotal+=1
如果currentRowTotal==1:
持续
totals0+=int(第[0]行)
totals1+=int(第[1]行)
totals2+=int(第[2]行)
如果第[3]行=“”:
总计S3+=0
f、 关闭()
打开(文件名)为f时:
readObject=csv.reader(f)
currentRow=0
对于readObject中的行:

而currentRow则使用顶行来确定列标题。根据标题初始化汇总字典

import csv

with open("file.csv") as f:
  reader = csv.reader(f)

  titles = next(reader)
  while titles[-1] == '':
    titles.pop()
  num_titles = len(titles)      
  totals = { title: 0 for title in titles }

  for row in reader:
    for i in range(num_titles):
      totals[titles[i]] += int(row[i])

print(totals)
让我补充一点,您不必在
with
块之后关闭文件。
with
的关键在于它负责关闭文件

另外,请允许我提及您发布的数据似乎有四列:

John,Jeff,Judy,
21,19,32,
178,182,169,
85,74,57,
这就是我为什么这么做的原因:

  while titles[-1] == '':
    titles.pop()

这有点脏,但请尝试以下操作(在没有最后一列为空的情况下操作):


不确定您是否可以使用熊猫,但您可以按如下方式获得您的口述:

import pandas as pd
df = pd.read_csv('data.csv')
print(dict(df.sum()))
给出:

{'Jeff': 275, 'Judy': 258, 'John': 284}

基于Michasel的解决方案,我会尝试使用更少的代码和变量,并且不依赖于
Numpy

import csv

with open("so.csv") as f:
  reader = csv.reader(f)
  titles = next(reader)
  sum_result = reduce(lambda x,y: [ int(a)+int(b) for a,b in zip(x,y)], list(reader))

  print dict(zip(titles, sum_result))
{'Jeff': 275, 'Judy': 258, 'John': 284}
import csv

with open("so.csv") as f:
  reader = csv.reader(f)
  titles = next(reader)
  sum_result = reduce(lambda x,y: [ int(a)+int(b) for a,b in zip(x,y)], list(reader))

  print dict(zip(titles, sum_result))