Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.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 使用dictreader访问列_Python_List_Csv_Dictionary - Fatal编程技术网

Python 使用dictreader访问列

Python 使用dictreader访问列,python,list,csv,dictionary,Python,List,Csv,Dictionary,问题: 我在使用python的dictreader从csv文件中查找列的平均值时遇到了一个问题 我试过了: 使用列名访问像这样的列是可行的,但列名是必需的,我不确定如何在reader.fieldnames上循环,以便仅从每个列构造一个列表,而不是将所有列数据混合到同一个列表中: for r in reader: print(r.get("Price")) 循环示例 for i in reader.fieldnames: for r in re

问题

我在使用python的dictreader从csv文件中查找列的平均值时遇到了一个问题

我试过了

使用列名访问像这样的列是可行的,但列名是必需的,我不确定如何在reader.fieldnames上循环,以便仅从每个列构造一个列表,而不是将所有列数据混合到同一个列表中:

          for r in reader:
            print(r.get("Price"))
循环示例

for i in reader.fieldnames:
    for r in reader:
        print(row.get(i))
这很好,但是对于每一行,从每一列打印出一个元素。这使得收集所有价格、所有名称等的列表变得很困难,因为它只是以列表形式重新构建听写器

问题

我怎样才能从dictreader中只读取一整列,这样我就可以作为列表单独访问每一列并对其执行操作


注意:到目前为止,我已经尝试使用循环来追加每个元素,但结果是一个N大小的数组,每行有4个元素。

如果您可以为每个要读取的列在文件上循环一次,只需构建一个列表理解的dict理解:

columns = {fieldname: [row.get(fieldname) for row in reader] for fieldname in reader.fieldnames}
没有更好的方法,只是根据文件的性质。。。csv是一系列行,将它们转换为列会有点浪费。如果只希望提取某些字段名,则可以对此进行修补

但是,如果确实需要只读取一次文件,请执行以下操作:

columns = {}
for row in reader:
    for fieldname in reader.fieldnames:
        columns.setdefault(fieldname, []).append(row.get(fieldname))

如果您可以为每个要阅读的列在文件上循环一次,只需构建列表理解的dict理解:

columns = {fieldname: [row.get(fieldname) for row in reader] for fieldname in reader.fieldnames}
没有更好的方法,只是根据文件的性质。。。csv是一系列行,将它们转换为列会有点浪费。如果只希望提取某些字段名,则可以对此进行修补

但是,如果确实需要只读取一次文件,请执行以下操作:

columns = {}
for row in reader:
    for fieldname in reader.fieldnames:
        columns.setdefault(fieldname, []).append(row.get(fieldname))
你可以使用这个模块。它非常强大,可以处理csv文件

import pandas as pd
df = pd.read_csv(csv_file)
saved_column = df['column_name']
你可以使用这个模块。它非常强大,可以处理csv文件

import pandas as pd
df = pd.read_csv(csv_file)
saved_column = df['column_name']
使用一个普通的reader对象,获取标题,转换数据,将标题与数据结合起来创建dict

import csv
with open('data.csv') as f:
    reader = csv.reader(f)
    headers = next(reader)
    # transpose the data
    # --> columns become rows and rows become columns
    data = zip(*reader)
    # create a dictionary by combining the headers with the data
    d = dict(zip(headers, data))

使用一个普通的reader对象,获取标题,转换数据,将标题与数据结合起来创建dict

import csv
with open('data.csv') as f:
    reader = csv.reader(f)
    headers = next(reader)
    # transpose the data
    # --> columns become rows and rows become columns
    data = zip(*reader)
    # create a dictionary by combining the headers with the data
    d = dict(zip(headers, data))


很好的建议,谢谢你的回答!但理想情况下,我不想使用csv等以外的任何额外库。
pandas
petl
都是非常好的选择,如果您的数据集非常大,或者您的项目需求开始增长。我的答案肯定是幼稚的“编程101”解决方案,在野外,你会期望使用这些模块中的一个。@Toreschliman-如果你不需要Pandas数据帧的全部功能-如果你可以轻松地使用内置模块完成任务,在名称空间中添加无关的模块可能不值得。很好的建议,感谢您的回答!但理想情况下,我不想使用csv等以外的任何额外库。
pandas
petl
都是非常好的选择,如果您的数据集非常大,或者您的项目需求开始增长。我的答案肯定是幼稚的“编程101”解决方案,在野外,你会期望使用其中一个模块。@Toreschliman-如果你不需要Pandas DataFrame的全部功能-如果你可以使用内置轻松完成任务,那么在命名空间中添加无关的模块可能不值得。