Python 提示用户输入csv文件中的列名(不使用框架)
我试图从一个包含近4000行的csv文件中获取列名。大约有14列 我试图获取每一列并将其存储到列表中,然后提示用户自己输入至少5列他们想要查看的列 然后,用户应该能够键入他们希望看到的结果数量(它们应该是该列中最小的结果) 例如,如果他们选择服装品牌“8”,则会显示8个最便宜的品牌Python 提示用户输入csv文件中的列名(不使用框架),python,list,csv,dictionary,for-loop,Python,List,Csv,Dictionary,For Loop,我试图从一个包含近4000行的csv文件中获取列名。大约有14列 我试图获取每一列并将其存储到列表中,然后提示用户自己输入至少5列他们想要查看的列 然后,用户应该能够键入他们希望看到的结果数量(它们应该是该列中最小的结果) 例如,如果他们选择服装品牌“8”,则会显示8个最便宜的品牌 到目前为止,我已经能够使用“with”并获得包含每个列的列表,但是我很难提示用户至少选择其中的5列。您可以很好地使用Python输入从用户获取输入,如果您想要提示次数,请使用for循环获取输入。检查以下代码: def
到目前为止,我已经能够使用“with”并获得包含每个列的列表,但是我很难提示用户至少选择其中的5列。您可以很好地使用Python输入从用户获取输入,如果您想要提示次数,请使用for循环获取输入。检查以下代码:
def get_user_val(no_of_entries = 5):
print('Enter {} inputs'.format(str(no_of_entries)))
val_list = []
for i in range(no_of_entries):
val_list.append(input('Enter Input {}:'.format(str(i+1))))
return val_list
get_user_val()
我希望我没有误解你的意思,下面的代码就是你想要的 您可以将数据放入
目录
,然后对其进行排序
解决方案1
从io导入StringIO
从集合导入defaultdict
导入csv
随机输入
导入pprint
def random_price():
返回random.randint(11000)
def创建测试数据(n_行=4000,n_列=14,sep=','):
列=[chr(65+i)表示范围内的i(n列)]\A,B。。。
title=sep.join(列)
结果列表=[标题]
对于范围内的当前行(n行):
结果列表追加(sep.join([str(random_price())表示范围内的(n_col)])
返回'\n'。加入(结果列表)
def main():
如果“加载CSV”:
测试内容=创建测试数据(n\u行=10,n\u列=5)
dict_品牌=默认dict(列表)
将StringIO(测试内容)作为f:
rows=csv.reader(f,分隔符=',')
对于idx,枚举中的行(行):
如果idx==0:#标题
列=行
持续
对于i,枚举中的值(行):
dict_brand[第[i]列].追加(int(value))
pprint.pprint(dict_品牌,缩进=4,紧凑=True,宽度=120)
用户选择=输入(“输入列(品牌)”)
结果的数量=5个输入(“…”)
watch_columns=用户选择。拆分(“”)#D E F
对于“监视”列中的列名称:
cur_brand_list=dict_brand[col_name]
打印(已排序(当前品牌列表,反向=True)[:结果数量])
#打印(f'{col_name}:{sorted(cur_brand_list)}')#ASC
#打印(f'{col_name}:{sorted(cur_brand_list,reverse=True)}')#DESC
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
defaultdict(,
{'A':[9424635258545870912966487280830695088230],
‘B’:[1539155944618039854145409447512 74805289],
“C”:[770166861687313457236637607319254207640],
"D":[4313,3812,157,6674,8264,2636,765,2514,9833,1810],,
‘E’:[139446280058560571012255288696166024609])
输入列(品牌)C D
[9640, 7701, 6686, 6637, 6073]
[9833, 8264, 6674, 4313, 3812]
解决方案2:使用熊猫
为什么不是熊猫?我从来没有被教过熊猫框架。你不怕学它,而且学熊猫很容易而且值得。参赛作品的数量必须大于或等于5。如何将其与我的csv文件列列表连接?用户应该能够从要查看的数据和结果数中选择至少5列。通过编程,您必须为输入设置一些断点,即,
val>=5和val
def pandas_solution(test_content: str, watch_columns= ['C', 'D'], number_of_results=5):
with StringIO(test_content) as f:
df = pd.read_csv(StringIO(f.read()), usecols=watch_columns,
na_filter=False) # it can add performance (ignore na)
dict_result = defaultdict(list)
for col_name in watch_columns:
dict_result[col_name].extend(df[col_name].sort_values(ascending=False).head(number_of_results).to_list())
df = pd.DataFrame.from_dict(dict_result)
print(df)
C D
0 9640 9833
1 7701 8264
2 6686 6674
3 6637 4313
4 6073 3812