【问题标题】:parsing from a file in python从python中的文件解析
【发布时间】:2017-05-17 14:17:30
【问题描述】:

当我在终端中写入日期时,我会这样执行我的代码:

python code.py " date"

例如python code.py 2017-05-14,但我有超过 1500 个日期。我已将它们保存在 file.txt 中。

但我不知道如何调整代码中的解析以恢复文件中的所有变量

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    with open(...) as f:
    for line in f:
        <do something with line>
    parser.add_argument("date", help="date format YYYY-MM-DD", type=str)
    parser.add_argument("--output", help="csv output filepath",type=str)
    args = parser.parse_args()

    region = {
        'France':'France',
        'ACA':'Grand-Est',
        'ALP':'Nouvelle-Aquitaine',
        'ARA':'Auvergne-Rhônes-Alpes',
        'BFC':'Bourgogne-Franche-Comté',
        'BRE':'Bretagne',
        'CEN':'Centre-Val de Loire',
        'IDF':'Ile-de-France',
        'LRM':'Occitanie',
        'NPP':'Hauts-de-France',
        'NOR':'Normandie',
        'PLO':'Pays-de-Loire',
        'PAC':'PACA',
    }

    # french date format...
    datefr = args.date[-2:] + '/' + args.date[5:7] + '/' + args.date[:4]

    if args.output:
        output = args.output
    else:
        output = 'eco2mix-' + args.date + '.csv'

    # grab all regions...
    df = [grab_params({'region':k,'date':datefr}) for k in region.keys()]
    df = pd.concat(df)
    assert len(df) == 96*len(region.keys())

    # NOTE : patching malformed date...
    df['Date'] = [i if '-' in i else i[-4:]+'-'+i[3:5]+'-'+i[:2] for i in df['Date']]

    assert len(set(df.Date)) == 1

    # NOTE : remove - empty values by NaN
    df.replace(to_replace = '-', value = np.NaN, inplace=True)
    df.replace(to_replace = 'ND', value = np.NaN, inplace=True)

df.to_csv(output,index = False, encoding = 'UTF8')

【问题讨论】:

    标签: python file parsing


    【解决方案1】:

    据我了解,您想用日期解析文件并将每个文件传递给您的脚本,这对吗?你可以编写一个快速的 bash 脚本来做到这一点

    while read p; do
       python code.py $p
    done <file.txt
    

    您可以将其保存为 script.sh 文件并运行它以遍历文件中的每个日期

    【讨论】:

    • 谢谢,但它不起作用我收到此错误 AttributeError: 'Namespace' object has no attribute
    • 你能用回溯更新你的问题吗?这看起来像是您的 code.py 脚本中的 python 错误。 bash 脚本只是调用你的脚本
    • 如果某个日期我有超过 1000 个日期,我并没有错误只是代码错误,所以我不能每次都写我的日期,所以我有一个文件中的所有日期并且需要浏览他们
    • 是的,我明白了。我为您提供的那个 bash 脚本确实可以读取带有日期的文件,然后将其传递给您的 code.py 脚本
    • 我做到了,但我得到一个错误 Traceback (最近一次调用最后): File "rte.py", line 74, in assert len(set(df.Date)) == 1 断言错误
    【解决方案2】:

    为什么不向参数解析器添加一个 date_file 选项?

    parser.add_argument("-f", "--date-file", dest="date_file", help="file with dates in format YYYY-MM-DD", type=str, default=None)
    

    然后您可以修改您的代码,这样如果您输入一个日期文件,您可以执行以下操作:

    dates = [args.date]
    if args.date_file is not None:
        dates = list()
        with open(args.date_file) as handle:
            dates = [x.strip() for x in handle.read()]
    

    现在你有了所有的日期,你可以:

    for date in dates:
        # processing code goes here.
    

    您现在可以像这样执行代码:

    python code.py -f dates.txt
    

    【讨论】:

    • 谢谢你,但我没有理解这部分的日期:(我应该在这里做什么)
    • 我不清楚你到底想对日期做什么,所以我只是把它们放在一个 for 循环中。如果您使用的是 pandas DataFrame,则可以使用布尔表达式使用从文件中获取的日期对其进行索引。可能是我误解了你的问题。
    【解决方案3】:

    这是一个将日期文件解析为列表的快速示例

    dates.py

    from datetime import datetime
    import sys
    
    dates = []
    date_file = open(sys.argv[1])
    for line in date_file:
        formatted_date = datetime.strptime(line.rstrip(), "%Y-%m-%d")
        dates.append(formatted_date)
        # Implement code here, or loop through dates later
    
    print(dates)
    

    dates.txt

    2017-05-14
    2017-05-15
    2017-05-16
    2017-05-17
    

    python dates.py dates.txt 返回

    [datetime.datetime(2017, 5, 14, 0, 0), datetime.datetime(2017, 5, 14, 0, 0), datetime.datetime(2017, 5, 14, 0, 0), datetime.datetime(2017, 5, 14, 0, 0)]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多