【问题标题】:How to stop writing a blank line at the end of csv file - pandas如何停止在 csv 文件末尾写一个空行 - pandas
【发布时间】:2017-01-07 08:15:58
【问题描述】:

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

你如何避免这种情况?

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

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

不熟悉熊猫。我们将不胜感激您的帮助,在此先感谢!

【问题讨论】:

  • 在最后一行的末尾换行是很标准的。为什么这是个问题?
  • csv 文件将被另一个脚本使用,并且不能接受空行或多余的空格,脚本会中断。我无权访问这些脚本。目前我正在复制数据,将其粘贴到 vim 中,每次都删除最后一行。我想尽可能地自动化它。
  • 如果你传递None作为文件名,pandas返回一个字符串对象。 s = data.to_csv(None, sep=',') 例如。您可以直接将s[:-1] 写入文件。我不确定编码虽然。可以试试吗?
  • @medev21 结果 csv。您可以使用 vanilla Python 将其简单地写入文件。
  • 是的,juanpa 是正确的,它是 csv。您可以使用open('test.txt', 'w').write(s[:-1]) 写入文件

标签: python csv pandas


【解决方案1】:

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

【讨论】:

  • 最后一行变成一个系列,然后每一列变成一行...
【解决方案2】:

由于某种原因,当我尝试它时,行终止符不起作用。 (它给出了一个错误,说 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)

【讨论】:

  • 要克服此错误,请使用以下语法:data.iloc[-1:, 0:-1].to_csv(index=False, sep=',', header=False,mode=' a', line_terminator="")
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:
    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]

    【讨论】:

      【解决方案5】:

      一种解决方案是不使用 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
      

      【讨论】:

        【解决方案6】:

        上述解决方案均无效,因为正如最初的问题所问的那样,他试图将文件发送到另一个不接受回车的脚本/REST API。这可能是由他用来将 csv 文件发送到 REST API 的请求库引起的。我能够使用 requests 库通过 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-17
          • 2015-06-02
          • 2016-03-18
          • 1970-01-01
          • 2018-07-02
          • 2022-01-07
          • 2013-04-02
          • 2013-10-16
          相关资源
          最近更新 更多