Python 使用dictreader访问列
问题: 我在使用python的dictreader从csv文件中查找列的平均值时遇到了一个问题 我试过了: 使用列名访问像这样的列是可行的,但列名是必需的,我不确定如何在reader.fieldnames上循环,以便仅从每个列构造一个列表,而不是将所有列数据混合到同一个列表中: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
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的全部功能-如果你可以使用内置轻松完成任务,那么在命名空间中添加无关的模块可能不值得。