2013-06-16 3 views
14

Интересно, как добавить новые данные DataFrame в конец существующего файла csv? To_csv не упоминает такую ​​функциональность. Заранее спасибо.pandas DataFrame output end of csv

ответ

25

Вы можете добавить с помощью to_csv, передавая файл, который open in append mode:

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

header=None Используйте, чтобы не добавлять имена столбцов.

В самом деле, панды имеет оболочку, чтобы сделать это в to_csv используя mode аргумент (see Joe's answer):

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

необходимо также закрыть файл по f.close(). Энди, ты делаешь мой день. Он работает как шарм, я из c/C++ этнического и должен изучить философию питона. Любое предложение? – perigee

+0

Энди, действительно оценил :-D (не может использовать символ @ :-() – perigee

+0

Бонус указывает, что это закрывает файл после to_csv. У меня есть код, который попадает в__диск и находил файлы, оставшиеся открытыми на последующих итерациях. –

2

Благодаря Энди, полное решение:

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

Просто, чтобы упомянуть, это по существу эквивалентно выше, но после этого вы остаетесь с закрытым файлом (f), тогда как с ['with' ] (http://preshing.com/20110920/the-python-with-statement-by-example), он очищает это для вас. :) –

22

Вы можете также передать файловый режим в качестве аргумента методу to_csv

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

Немного вспомогательной функции я использую (на основе ответа Джо Хупера) с некоторыми гарантиями проверки заголовков для обработки все:

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) 
Смежные вопросы