如何停止在csv文件末尾写一个空行 - 熊猫

时间:2016-08-30 22:00:48

标签: python csv pandas

将数据保存到csv data.to_csv('csv_data', sep=',', encoding='utf-8', header= False, index = False)时,会在csv文件末尾创建一个空行。

你如何避免这种情况?

它与line_terminator有关,它的默认值为n,用于换行。

有没有办法指定line_terminator以避免在结尾处创建空行,或者我是否需要读取csv文件,删除空白行并保存?

不熟悉大熊猫。我们将非常感谢您的帮助!

5 个答案:

答案 0 :(得分:5)

一种方法是保存除最后一个条目以外的数据,默认为line_terminator\n),并在最后一行附加line_terminator=""

data1 = data.iloc[0:len(data)-1]
data2 = data.iloc[[len(data)-1]]
data1.to_csv('csv_data', sep=',', encoding='utf-8', header= False, index = False)
data2.to_csv('csv_data', sep=',', encoding='utf-8', header= False, index = False,mode='a',line_terminator="")

答案 1 :(得分:3)

出于某种原因,当我尝试它时,行终止符不起作用。 (它给出了一个错误,说line_terminator是一个无法识别的关键字参数。)

但是,这样做可以解决问题:

    df.to_csv(path)
    with open(path) as f:
        lines = f.readlines()
        last = len(lines) - 1
        lines[last] = lines[last].replace('\r','').replace('\n','')
    with open(path, 'w') as wr:
        wr.writelines(lines)

答案 2 :(得分:0)

更有效的方法是首先打开文件,写入该流,然后删除最后一个换行符:

import os
with open('csv_data', 'wb') as dst:
    data.to_csv(wb, sep=',', encoding='utf-8', header= False, index = False)
    dst.seek(-1, os.SEEK_END) # <---- 1 : len('\n')
    dst.truncate()

答案 3 :(得分:0)

file_out = r'c:\your_output_file_path\file_name.csv'
df.to_csv(file_out)
file_data = open(file_out, 'rb').read()
open(file_out, 'wb').write(file_data[:-2])

df.to_csv()函数具有一个名为line_terminator的参数,默认值为'\ n'。这个换行符是当前的问题。

上面的代码:
1)像往常一样将数据帧写入文件
2)打开文件,并将字节数据读入file_data变量
3)将file_data变量写回到同一文件,但使用以下剪接修剪'\ n':file_data [:-2]

答案 4 :(得分:0)

一种解决方案是不使用 pandas 将数据导出到文件。下面的示例不会在文件末尾包含空行。但是,它可能比熊猫的“to_csv”方法慢很多。

import pandas as pd

def export_dataframe_to_file( 
        df: pd.DataFrame, file_name: str, 
        header=True, index=True, delimiter=',',
        line_terminator='\n', encoding='utf-8' 
        ) -> None:
    '''
    This function exports a Pandas DataFrame to a file without
    including an empty row at the very end of the file.
    '''
    number_of_rows, current_row = len(df), 1
    with open(file_name, 'w', encoding=encoding) as file :
        if header:
            file.write( 
                delimiter*index + delimiter.join(df.columns) \
                + line_terminator 
                )
        for df_index, series in df.iterrows():
            file.write( 
                (str(df_index) + delimiter)*index \
                + delimiter.join(series.astype( str )) \
                + line_terminator*(not not number_of_rows - current_row)
                )
            current_row += 1
    return