提示用户输入csv文件中的列名(不使用框架)

2024-06-17 12:14:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个包含近4000行的csv文件中获取列名。大约有14列

我试图获取每一列并将其存储到列表中,然后提示用户自己输入至少5列他们想要查看的列

然后,用户应该能够键入他们希望看到的结果数量(它们应该是该列中最小的结果)

例如,如果他们选择服装品牌“8”,则会显示8个最便宜的品牌

到目前为止,我已经能够使用“with”并获得包含每个列的列表,但我在提示用户至少选择其中5列时遇到了问题


Tags: 文件csv用户列表数量键入with品牌
2条回答

您可以很好地使用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()

我希望我没有误解你的意思,下面的代码就是你想要的

您可以将数据放入dict中,然后对其进行排序

解决方案1

from io import StringIO
from collections import defaultdict
import csv
import random
import pprint


def random_price():
    return random.randint(1, 10000)


def create_test_data(n_row=4000, n_col=14, sep=','):
    columns = [chr(65+i) for i in range(n_col)]  # A, B ...
    title = sep.join(columns)
    result_list = [title]
    for cur_row in range(n_row):
        result_list.append(sep.join([str(random_price()) for _ in range(n_col)]))
    return '\n'.join(result_list)


def main():
    if 'load CSV':
        test_content = create_test_data(n_row=10, n_col=5)

        dict_brand = defaultdict(list)
        with StringIO(test_content) as f:
            rows = csv.reader(f, delimiter=',')
            for idx, row in enumerate(rows):
                if idx == 0:  # title
                    columns = row
                    continue
                for i, value in enumerate(row):
                    dict_brand[columns[i]].append(int(value))

    pprint.pprint(dict_brand, indent=4, compact=True, width=120)
    user_choice = input('input columns (brand)')
    number_of_results = 5  # input('...')
    watch_columns = user_choice.split(' ')  # D E F

    for col_name in watch_columns:
        cur_brand_list = dict_brand[col_name]
        print(sorted(cur_brand_list, reverse=True)[:number_of_results])
        # print(f'{col_name} : {sorted(cur_brand_list)}')  # ASC
        # print(f'{col_name} : {sorted(cur_brand_list, reverse=True)}')  # DESC


if __name__ == '__main__':
    main()

defaultdict(<class 'list'>,
            {   'A': [9424, 6352, 5854, 5870, 912, 9664, 7280, 8306, 9508, 8230],
                'B': [1539, 1559, 4461, 8039, 8541, 4540, 9447, 512, 7480, 5289],
                'C': [7701, 6686, 1687, 3134, 5723, 6637, 6073, 1925, 4207, 9640],
                'D': [4313, 3812, 157, 6674, 8264, 2636, 765, 2514, 9833, 1810],
                'E': [139, 4462, 8005, 8560, 5710, 225, 5288, 6961, 6602, 4609]})
input columns (brand)C D
[9640, 7701, 6686, 6637, 6073]
[9833, 8264, 6674, 4313, 3812]

解决方案2:使用熊猫

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

相关问题 更多 >