在分析数据时,我将我的数据框保存到csv文件中,并使用pd.to_csv()
进行操作。然而,该函数会直接将新文件覆盖原有的同名文件而不进行检查。
我知道可以将系统日期时间添加到文件名中,这样就可以避免覆盖文件,但我想知道什么时候犯了错误。
在分析数据时,我将我的数据框保存到csv文件中,并使用pd.to_csv()
进行操作。然而,该函数会直接将新文件覆盖原有的同名文件而不进行检查。
我知道可以将系统日期时间添加到文件名中,这样就可以避免覆盖文件,但我想知道什么时候犯了错误。
请尝试以下操作:
import glob
import pandas as pd
# Give the filename you wish to save the file to
filename = 'Your_filename.csv'
# Use this function to search for any files which match your filename
files_present = glob.glob(filename)
# if no matching files, write to csv, if there are matching files, print statement
if not files_present:
pd.to_csv(filename)
else:
print 'WARNING: This file already exists!'
我没有测试过这个代码,但是它是从我之前编写的某些代码中提取和编译而来的。这将简单地阻止文件覆盖其他文件。注意,您将不得不自己更改文件名变量以保存文件,或者像您建议的那样使用一些日期时间变量。希望这在某种程度上有所帮助。
os.path.exists()
是检查路径是否存在的一种简单方法。但这种方法是导致时序竞态错误的一个常见源头。尝试使用 pd.to_csv(filename, mode='x')
,如果目标文件已经存在,它将引发异常。 - wjt对于3.3+版本,请使用mode='x'
来自文档:
以独占方式创建文件,如果文件已经存在,则失败
try:
df.to_csv('abc.csv', mode='x')
except FileExistsError:
df.to_csv('unique_name.csv')
根据TaylorDay的建议,我对这个函数进行了一些调整。使用以下代码时,将询问您是否要覆盖现有文件。如果不是,则允许您输入另一个名称。然后,将再次调用相同的写入函数,该函数将再次检查 new_filename
是否存在。
from os import path
import pandas as pd
def write_csv_df(path, filename, df):
# Give the filename you wish to save the file to
pathfile = os.path.normpath(os.path.join(path,filename))
# Use this function to search for any files which match your filename
files_present = os.path.isfile(pathfile)
# if no matching files, write to csv, if there are matching files, print statement
if not files_present:
df.to_csv(pathfile, sep=';')
else:
overwrite = raw_input("WARNING: " + pathfile + " already exists! Do you want to overwrite <y/n>? \n ")
if overwrite == 'y':
df.to_csv(pathfile, sep=';')
elif overwrite == 'n':
new_filename = raw_input("Type new filename: \n ")
write_csv_df(path,new_filename,df)
else:
print "Not a valid input. Data is NOT saved!\n"
os.path.isfile()
返回一个布尔值,指示文件是否已经存在于您的系统中。如果该文件确实存在,则可以创建一个新文件。
import os
if os.path.isfile(file_path):
# make new file