如何停止在csv文件- pandas的末尾写空行



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

如何避免这种情况?

它与line_terminator有关,它的默认值是n,用于新行。

是否有一种方法可以指定line_terminator以避免在末尾创建空行,或者我需要读取csv文件,删除空行并保存它?

不熟悉熊猫。您的帮助将不胜感激,提前感谢!

一种方法是保存除最后一项以外的数据,默认为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="")

由于某种原因,当我尝试它时,行终止符不起作用。(它给出了一个错误,说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)
file_out = r'c:your_output_file_pathfile_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变量写回同一个文件,但是用splice删除'n': file_data[:-2]

一种解决方案是不使用pandas将数据导出到文件。下面的示例在文件末尾不包含空行。然而,它可能比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

上面的解决方案都不起作用,因为正如最初的问题所问的那样,他试图将文件发送到另一个不接受回车的脚本/REST API。这可能是由于他用来将csv文件发送到REST API的请求库造成的。我能够使用请求库发送一个文件,其中有一个回车通过REST API:

import requests
import pandas as pd
import settings

file_name = Hierarchy.csv'
df = pd.read_csv(file_name)
df.to_csv(file_name, sep=',', encoding='utf-8', index=False)
headers = {
  'x-api-key': settings.MONITOR_REST_API_KEY,
  'x-api-token': settings.MONITOR_REST_API_TOKEN,
  'accept': 'application/json'
}
files = {'file': (file_name, open(file_name, 'rb'), 'text/csv')}
monitor_rest_url = "https://api.yourcloud.com"
response = requests.post(monitor_rest_url +'/api/v2/your_endpoint',
                        files=files, verify=False, headers=headers)
print(response.text)

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

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()

最新更新