将数据保存到csv data.to_csv('csv_data', sep=',', encoding='utf-8', header= False, index = False)
时,会在csv文件末尾创建一个空行。
你如何避免这种情况?
它与line_terminator
有关,它的默认值为n
,用于换行。
有没有办法指定line_terminator
以避免在结尾处创建空行,或者我是否需要读取csv文件,删除空白行并保存?
不熟悉大熊猫。我们将非常感谢您的帮助!
答案 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