【问题标题】:UPDATE: Error in command line: ValueError: Invalid file path or buffer object type: <class 'pandas.core.frame.DataFrame'>更新:命令行错误:ValueError:无效的文件路径或缓冲区对象类型:<class 'pandas.core.frame.DataFrame'>
【发布时间】:2020-09-14 18:55:18
【问题描述】:

我现在的函数工作如下:即使它执行了正确的解决方案,我的 CMD 行中也出现了一个巨大的错误 https://i.stack.imgur.com/PBTwz.png(ValueError:无效的文件路径或缓冲区对象类型:)。有谁知道为什么我得到这个错误,即使输出执行正确?

import pandas as pd
import numpy as np
import argparse

target_col = "CountryRefs"

sep = ","

input_file = 'Test_set'

def arg_parse():
    parser = argparse.ArgumentParser()
    parser.add_argument("-f", "--input_file", required = True)
    parser.add_argument("-s", "--sep", required=True,)
    parser.add_argument("-t", "--target_col", required=True)
    args=parser.parse_args()
    return vars(args)

def splitter(input_file, target_col, sep, new_col = None, *argv):
    df = pd.read_csv(input_file)
    df[target_col] = df[target_col].str.split(sep)
    exploded = df.explode(target_col)
    exploded[target_col].replace(r'^\s*$', np.nan, regex=True, inplace = True)
    exploded.dropna(subset=[target_col], inplace=True)
    if new_col == None:
        return(pd.DataFrame(exploded[[target_col,*argv]]))
    else:
        exploded[new_col] = exploded[target_col]
        return(pd.DataFrame(exploded[[new_col,*argv]]))

if __name__ == '__main__':
    args = arg_parse()
    print(splitter(**args))

【问题讨论】:

  • 看起来不错,你有什么错误吗?
  • 是的,我知道了:
  • Argparse 错误:错误:需要以下参数:-f/--df,-s/--sep, -t/--target_col
  • 你应该在调用你的函数时指定这些参数:python -f something
  • 你知道如何指定命令行参数吗?你是如何运行这个脚本的?从操作系统外壳窗口?或者像sypder这样的IDE或者一个窗口?

标签: python pandas cmd argparse tabpy


【解决方案1】:

你想要这样的东西

import pandas as pd
import numpy as np
import argparse


target_col = "CountryRefs"

sep = ","

data = {'CountryRefs':['Italy, Germany', 'Japan , France', '', 'Alaska'],
    'Authors':['Dom', 'Xavier', 'Kathleen', 'Joe'], 'Friends':['Amy Pete', 'Joe', None, 'Franklin'],
    'Colors':['red.blue', ' ', 'yellow', 'black.blue']}
df = pd.DataFrame(data, columns = ['CountryRefs', 'Authors', 'Friends', 'Colors'])

def arg_parse():
    parser = argparse.ArgumentParser()
    parser.add_argument('argv', type=str, nargs='*', default=[])
    parser.add_argument("-s", "--sep", dest="sep", required=True, default=',')
    parser.add_argument("-t", "--target_col", dest="target_col", required=True, default='1')

    args=parser.parse_args()
    return vars(args)

def splitter(df, target_col, sep, new_col = None, argv=[]):

    df[target_col] = df[target_col].str.split(sep)
    exploded = df.explode(target_col)
    exploded[target_col].replace(r'^\s*$', np.nan, regex=True, inplace = True)
    exploded.dropna(subset=[target_col], inplace=True)
    if new_col == None:
        return(pd.DataFrame(exploded[[target_col,*argv]]))
    else:
        exploded[new_col] = exploded[target_col]
        return(pd.DataFrame(exploded[[new_col,*argv]]))

if __name__ == '__main__':
    args = arg_parse()
    print(splitter(df, **args))

然后你通过调用 this 来执行这段代码

python sep.py -t CountryRefs -s ','

或者像这样

python sep.py -t CountryRefs -s ',' Friends Colors

【讨论】:

  • 为了更简单,您可以去掉 dest 参数(它们只是指定从第一个长选项推断的内容),您可能可以取消 required论据。 (无论是它们,还是默认值,让这些选项真正成为可选更有意义。)
  • 您不能将 df 作为参数传递 - 但您可以将文件名作为参数传递,然后通过读取该文件来创建数据框。
  • 如何在函数中为 *argv 参数添加解析器参数?
猜你喜欢
  • 2021-08-06
  • 2022-01-07
  • 2018-09-03
  • 2020-05-28
  • 2021-04-14
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
相关资源
最近更新 更多