Pandas to_csv() 检查是否覆盖写入

38

在分析数据时,我将我的数据框保存到csv文件中,并使用pd.to_csv()进行操作。然而,该函数会直接将新文件覆盖原有的同名文件而不进行检查。

有没有办法检查文件是否已经存在,如果存在则要求选择一个新的文件名?

我知道可以将系统日期时间添加到文件名中,这样就可以避免覆盖文件,但我想知道什么时候犯了错误。


1
欢迎提供如何改进问题的反馈。投票者能否解释一下他的反对票呢?我很乐意做出一些调整。 - Robin Kramer-ten Have
我不是给你点踩的人,但我猜可能是因为这个答案很可能可以通过谷歌搜索得到。 - Wboy
不幸的是它没有,但我必须说我一直在寻找一个Pandas内置或类似的东西。没有想到可以用一个简单的if语句解决。 - Robin Kramer-ten Have
4个回答

14

请尝试以下操作:

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!' 

我没有测试过这个代码,但是它是从我之前编写的某些代码中提取和编译而来的。这将简单地阻止文件覆盖其他文件。注意,您将不得不自己更改文件名变量以保存文件,或者像您建议的那样使用一些日期时间变量。希望这在某种程度上有所帮助。


非常感谢。这是一个相当简单的解决方案 :) - Robin Kramer-ten Have
10
os.path.exists() 是检查路径是否存在的一种简单方法。但这种方法是导致时序竞态错误的一个常见源头。尝试使用 pd.to_csv(filename, mode='x'),如果目标文件已经存在,它将引发异常。 - wjt

8

对于3.3+版本,请使用mode='x'

来自文档

以独占方式创建文件,如果文件已经存在,则失败

try:
    df.to_csv('abc.csv', mode='x')
except FileExistsError:
    df.to_csv('unique_name.csv')

5

根据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"

0

os.path.isfile() 返回一个布尔值,指示文件是否已经存在于您的系统中。如果该文件确实存在,则可以创建一个新文件。

import os
if os.path.isfile(file_path):
    # make new file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接