【问题标题】:pandas DataFrame output end of csvcsv的pandas DataFrame输出端
【发布时间】:2013-06-12 15:56:52
【问题描述】:

我想知道如何将新的DataFrame 数据添加到现有 csv 文件的末尾? to_csv 没有提到这样的功能。

【问题讨论】:

标签: python csv pandas dataframe


【解决方案1】:

您可以通过传递open in append mode 的文件来使用to_csv 追加:

with open(file_name, 'a') as f:
    df.to_csv(f, header=False)

使用header=None,以免追加列名。

事实上,pandas 在to_csv 中使用mode 参数(see Joe's answer)有一个包装器:

df.to_csv(f, mode='a', header=False)

【讨论】:

  • 还需要通过f.close()关闭文件。安迪,你让我开心。它就像一个魅力,我来自 c/c++ 种族,需要学习 python 哲学。有什么建议吗?
  • 安迪,非常感谢:-D(不能使用@符号:-()
  • 在 to_csv 之后关闭文件的奖励点。我有一些代码经常遇到 to_csv 并且发现文件在以后的迭代中保持打开状态。
  • @EzekielKruglick 您是否将打开的文件传递给to_csv 或文件名?我记得一个相关的问题,即 not 关闭文件导致他们的代码加速了 99%(IIRC 他们将数万次附加到同一个文件中)。
  • @perigee 当使用“with”时,文件总是自动关闭。 blog.lerner.co.il/dont-use-python-close-files-answer-depends
【解决方案2】:

您也可以将文件模式作为参数传递给to_csv method

df.to_csv(file_name, header=False, mode = 'a')

【讨论】:

    【解决方案3】:

    我使用的一个小辅助函数(基于 Joe Hooper 的回答)和一些标题检查保护措施来处理这一切:

    def appendDFToCSV_void(df, csvFilePath, sep=","):
        import os
        if not os.path.isfile(csvFilePath):
            df.to_csv(csvFilePath, mode='a', index=False, sep=sep)
        elif len(df.columns) != len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns):
            raise Exception("Columns do not match!! Dataframe has " + str(len(df.columns)) + " columns. CSV file has " + str(len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns)) + " columns.")
        elif not (df.columns == pd.read_csv(csvFilePath, nrows=1, sep=sep).columns).all():
            raise Exception("Columns and column order of dataframe and csv file do not match!!")
        else:
            df.to_csv(csvFilePath, mode='a', index=False, sep=sep, header=False)
    

    【讨论】:

    • 第 3 个测试用例是否有 API 设置,dataframe 和 csv 之间的列顺序不匹配?我想写没有标题,但要隐式重新排序列。
    【解决方案4】:

    感谢安迪,完整的解决方案:

    f = open(filename, 'a') # Open file as append mode
    df.to_csv(f, header = False)
    f.close()
    

    【讨论】:

    • 顺便提一下,这基本上等同于上面的内容,但在此之后你会留下一个关闭的文件 (f),而使用 with 它会为你清理它。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2012-08-19
    相关资源
    最近更新 更多