2015-06-27 70 views
5

我有一个为Pandas设置的函数,该函数在input.csv中运行大量行并将结果输入到Series中。然后它将该系列文字写入output.csv熊猫:从函数连续写入csv

但是,如果进程被中断(例如意外事件),程序将终止并且所有将进入csv的数据都将丢失。

是否有办法将数据连续写入csv,而不管函数是否完成所有行?

优选地,每次程序启动时,都会创建一个空白的output.csv,该空白被附加到函数运行时附加。

import pandas as pd 

df = pd.read_csv("read.csv") 

def crawl(a): 
    #Create x, y 
    return pd.Series([x, y]) 

df[["Column X", "Column Y"]] = df["Column A"].apply(crawl) 
df.to_csv("write.csv", index=False) 
+1

随着时间写入块并追加到csv,在第一次写入之后使用'mode ='a',header = False'。你可以 –

+0

这个命令还有问题吗? –

+0

你是指列的顺序?如果是这样,是的,他们需要按照一定的顺序。 – Winterflags

回答

2

最后,这是我想出的。感谢您的帮助!

import pandas as pd 

df1 = pd.read_csv("read.csv") 

run = 0 

def crawl(a): 

    global run 
    run = run + 1 

    #Create x, y 

    df2 = pd.DataFrame([[x, y]], columns=["X", "Y"]) 

    if run == 1: 
     df2.to_csv("output.csv") 
    if run != 1: 
     df2.to_csv("output.csv", header=None, mode="a") 

df1["Column A"].apply(crawl) 
+0

如果您有改进建议,请发布完整答案,我会相应地更改我选择的答案。 – Winterflags

+0

这将不会写入数据,如果你的程序崩溃,你仍然会失去所有的东西 –

+0

@PadraicCunningham它将写入成功传递'crawl(a)'的数据。但是如果当前通行证发生崩溃,那么这些数据将会丢失。不知道如何防止,除了'x'和'y'获得后立即写入csv。 – Winterflags

0

我建议这样的:

with open("write.csv","a") as f: 
    df.to_csv(f,header=False,index=False) 

的参数“a”将新追加DF到现有的文件和文件被关闭了与块结束后,所以你应该把所有你的中间结果。

10

这是一个可能的解决方案,它会将数据附加到新文件,因为它读取块中的csv。如果进程中断,则新文件将包含中断前的所有信息。

import pandas as pd 

#csv file to be read in 
in_csv = '/path/to/read/file.csv' 

#csv to write data to 
out_csv = 'path/to/write/file.csv' 

#get the number of lines of the csv file to be read 
number_lines = sum(1 for row in (open(in_csv))) 

#size of chunks of data to write to the csv 
chunksize = 10 

#start looping through data writing it to a new file for each chunk 
for i in range(1,number_lines,chunksize): 
    df = pd.read_csv(in_csv, 
      header=None, 
      nrows = chunksize,#number of rows to read at each loop 
      skiprows = i)#skip rows that have been read 

    df.to_csv(out_csv, 
      index=False, 
      header=False, 
      mode='a',#append data to csv file 
      chunksize=chunksize)#size of data to append for each loop 
+1

Might只需添加'import os;如果os.path.isfile(out_csv)else 1',并将其放在range()'调用的第一个位置 –

+0

开始= 1 + sum(1用于行打开(out_csv)))不知道mode ='a',很棒的提示! – jamesbev

1

我已经找到了解决类似的问题,通过每一行循环与iterrows)数据帧(并保存到csv文件,而你的情况可能是这样的:

for ix, row in df.iterrows(): 
    row['Column A'] = crawl(row['Column A']) 

    # if you wish to mantain the header 
    if ix == 0: 
     df.iloc[ix - 1: ix].to_csv('output.csv', mode='a', index=False, sep=',', encoding='utf-8') 
    else: 
     df.iloc[ix - 1: ix].to_csv('output.csv', mode='a', index=False, sep=',', encoding='utf-8', header=False)