【发布时间】:2015-09-08 14:07:47
【问题描述】:
如果“文件名”不存在,我想使用 pd.write_csv 写入“文件名”(带有标题),否则如果存在,则附加到“文件名”。如果我只是使用命令:
df.to_csv('filename.csv',mode = 'a',header ='column_names')
写入或追加成功,但似乎每次追加时都会写入标题。
如果文件不存在,我怎样才能只添加标题,如果文件存在,我怎样才能不添加标题?
【问题讨论】:
如果“文件名”不存在,我想使用 pd.write_csv 写入“文件名”(带有标题),否则如果存在,则附加到“文件名”。如果我只是使用命令:
df.to_csv('filename.csv',mode = 'a',header ='column_names')
写入或追加成功,但似乎每次追加时都会写入标题。
如果文件不存在,我怎样才能只添加标题,如果文件存在,我怎样才能不添加标题?
【问题讨论】:
不确定 pandas 中是否有方法,但检查文件是否存在将是一种简单的方法:
import os
# if file does not exist write header
if not os.path.isfile('filename.csv'):
df.to_csv('filename.csv', header='column_names')
else: # else it exists so append without writing the header
df.to_csv('filename.csv', mode='a', header=False)
【讨论】:
with open(filename, 'a') as f:
df.to_csv(f, mode='a', header=f.tell()==0)
第一次写入文件时会添加标题
【讨论】:
df.to_csv(f,mode='a', header=not f.tell()) 也可以。
with open(filename, 'a') as f:吗?
f.tell(),它返回文件读/写指针的当前位置(在这种情况下,如果已经存在内容,则使用附加模式报告非零),是的,你需要with open()
在 Pandas 数据框“to_csv”函数中,如果存在 csv 文件并附加到现有文件,则使用 header=False。
import os
hdr = False if os.path.isfile('filename.csv') else True
df.to_csv('filename.csv', mode='a', header=hdr)
【讨论】:
上述解决方案很棒,但我有道德义务在此处包含 pathlib 解决方案:
from pathlib import Path
file_path = Path(filename)
if file_path.exists():
df.to_csv(file_path, header=False, mode='a')
else:
df.to_csv(file_path, header=True, mode='w')
或者(取决于您的内联偏好):
file_exists = file_path.exists()
df.to_csv(file_path, header=not file_exists, mode='a' if file_exists else 'w')
【讨论】:
除了文件存在检查,您还可以检查非零文件大小。因为如果文件存在但文件大小为零,即没有内容的文件,则添加标题是有意义的。我发现它在一些特殊情况下很有帮助
import os.path
header_flag = False if (os.path.exists(fpath) and (os.path.getsize(fpath) > 0)) else True
df.to_csv(fpath, mode='a', index=False, header=header_flag)
【讨论】:
如果您有 dict() 并希望 写入并附加到 CSV 文件中:
import pandas as pd
file_name = 'data.csv'
my_dict = {"column_1":"Apple","column_2":"Mango"}
with open(file_name, 'a') as f:
df = pd.DataFrame(my_dict)
df.to_csv(f, mode='a', header=f.tell()==0)
【讨论】: