【问题标题】:Iterate list on query string element by element逐个元素地迭代查询字符串上的列表
【发布时间】:2021-07-01 02:37:24
【问题描述】:

我有一个要单独放入 url 的元素列表,将下载内容读取为 csv 并根据元素命名。然后继续到列表中的下一个元素。

例如(编造地址):

输入list = ['1','2','3'] query_string = f'https://query.number.com/download/{list}&real=true

我想要的输出是df_1 = pd.read_csv('https://query.number.com/download/{1}&real=true') df_2 = ('https://query.number.com/download/{2}&real=true') df_3 = ('https://query.number.com/download/{3}&real=true')

我认为 for 循环是必要的,但不确定如何完成第一个元素的过程,然后再移动到当前创建的下一个元素:

query_string = f'https://query.number.com/download/{'1','2','3'} 会产生错误,特别是当列表包含 100 个元素时

非常感谢任何帮助或了解更多信息的资源,请随时与我联系,因为我想发展我的编码社区! :)

【问题讨论】:

    标签: python rest loops for-loop iteration


    【解决方案1】:
    l = [1, 2, 3, 4]
    urls = [f'https://query.number.com/download/{i}' for i in l]
    

    这是你想要的吗?

    【讨论】:

    • 抱歉,不,因为这会创建 4 个 query.number.com/download{1,2,3,4} 副本,而不是 query.number.com/download{1}、query.number.com/download{2} 这有意义吗?谢谢!
    • 不,它没有。你检查我的代码了吗?它创建 4 个字符串:['query.number.com/download/1', 'query.number.com/download/2', 'query.number.com/download/3', 'query.number.com/download/4']
    • 谢谢你,你是对的,在我输入 l 而不是 i 之前,这就是它打印整个列表的原因。这仍然意味着我必须将 100 个链接复制并粘贴到搜索栏中,然后合并 100 个较小的数据集。你认为有更好的方法吗?感谢您的帮助 s0mbre
    • 我不确定我是否理解你最终想要做什么。您最初的问题是,如何在给定变量列表(如 1、2、3...)的情况下生成 URL 列表 - 对吗?所以我已经证明它非常简单。如果您的任务是实际下载文件并处理它们,那么请重新表述您的问题。
    【解决方案2】:

    我不确定我是否得到它。看来你不应该把那个列表放在最开始的query_string

    另外,list 是 Python 的内置类型,所以不建议在list 之后命名任何变量。

    ele = ['1', '2', '3']
    query_string = 'https://query.number.com/download/{}'
    for e in ele:
        do_sth(query_string.format(e))
        output_name = 'df_{}'.format(e)
    

    如果你更喜欢 f 字符串:

    ele = ['1', '2', '3']
    query_string = 'https://query.number.com/download'
    for e in ele:
        do_sth(f'{query_string}/{e}')
        output_name = f'df_{e}'
    

    【讨论】:

    • 抱歉,我编辑了我的问题,希望能解释我想要做的更好的事情,你是说使用列表遍历变量没有好处吗?你会用什么代替谢谢
    • 不,我是说你的list不应该直接放到query_string@Josh
    • 我明白了,当变量不在网站链接末尾时,您将如何解决这个问题?
    • 在我回答的第一种情况下,query_string = 'https://query.number.com/download/{}/something_else';在第二种情况下,do_sth(f'{query_string}/{e}/something_else')
    • 谢谢 Zebartin,这是有道理的。抱歉,如果这真的很愚蠢,我用 pd.read_csv(query_string.format(i)) output)name = 'df_{}'.format(i) 代替了但这并没有给我数据集,为什么会这样?在我命名之前需要下载它吗?对不起,如果它超级明显
    【解决方案3】:

    您可以创建一个列表来保存 dfs,并将 csv 读入新的 df,然后附加到您的 dfs 列表中。我不确定你为什么想要 100 个不同的 dfs。如果您想在 dfs 列表中对您的 dfs 执行某些操作,您可以使用 dfs 列表中的 df 索引保存到文件等。

    通常我会有 1 个巨大的 df 并将 1、2、3 输入作为值放在其中一列中。然后您可以根据输入列过滤df。

    list_of_dfs = []
    giant_df = pd.DataFrame()
    
    input_list = ['1', '2', '3']
    for inp in input_list:
        # get the df for this csv
        df = pd.read_csv('https://query.number.com/download/' + inp)
        
        # append to your list of dfs
        list_of_dfs.append(df)
    
        # or to keep it all in 1 df:
        df['input'] = inp
        giant_df = giant_df.append(df)
    
    # to filter a df with only the input 1
    df1 = giant_df[giant_df['input'] == '1']
    
    

    【讨论】:

    • 谢谢汉谟拉比,这看起来很棒,这么多数据框肯定有可能让人困惑,我遇到的问题是它们都有相同的列名,我认为重命名可能更容易我下载了 csvs 后的列,即小数_1、小数_2。如果您认为有更好的方法,我很乐意尝试并愿意与您进一步讨论。
    • 通常我不会重命名列,如果您需要区分不同的来源,只需将输入用作列(如在 Giant_df 中)。
    • 有道理,因为网址没有以 inp 结尾,它不识别输入列表任何建议?
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 2021-12-11
    • 2021-10-03
    • 2020-12-31
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多