向csvfile添加行而不创建中间副本

2024-05-07 15:34:28 发布

您现在位置:Python中文网/ 问答频道 /正文

如何通过在位编辑向csvfile添加行?我希望避免写入临时文件然后替换原始文件的模式(伪代码):

add_records_to_csv(newdata, infile, tmpfile)
delete(infile)
rename(tmpfile, infile)

这是实际的函数。“#<;--”这几行是我想要摆脱的,和/或浓缩成更直接的内容:

def add_records_to_csv(dic, csvfile):
    """ Append a dictionary to a CSV file.
        Adapted from http://pymotw.com/2/csv/
    """
    f_old = open(csvfile, 'rb')                         # <--
    csv_old = csv.DictReader(f_old)                     # <--

    fpath, fname = os.path.split(csvfile)               # <--
    csvfile_new = os.path.join(fpath, 'new_' + fname )  # <--
    print(csvfile_new)                                  # <--
    f = open(csvfile_new, 'wb')                         # <--

    try:
        fieldnames = sorted(set(dic.keys() + csv_old.fieldnames))
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        headers = dict( (n,n) for n in fieldnames )
        writer.writerow(headers)
        for row in csv_old:
            writer.writerow(row)
        writer.writerow(dic)
    finally:
        f_old.close()
        f.close()
    return csvfile_new

Tags: csvtocsvfileaddnewopenoldinfile
2条回答

一般来说这是不可能的。以下是原因,来自您的代码:

fieldnames = sorted(set(dic.keys() + csv_old.fieldnames))

对我来说,这意味着至少在某些情况下您的新行包含不在前几行中的列。添加这样的行时,除了在末尾追加新行之外,还必须更新文件头(第一行)。如果需要按字母顺序排列列名,则可能需要重新排列所有其他行中的字段,以保持列的顺序。你知道吗

因为您可能需要编辑文件的第一行,除了在末尾附加新行,还可能需要编辑文件中间的所有行,所以没有一种合理的方法来实现这一点。你知道吗

我的建议是,尝试提前找出可能需要包含的所有字段/列,这样您就可以保证您的程序永远不必编辑标题,只需添加新行。你知道吗

如果新行的结构与现有记录相同,则以下操作将起作用:

import csv

def append_record_to_csv(dic, csvfile):
    with open(csvfile, 'rb') as f:
        # discover order of field names in header row
        fieldnames = next(csv.reader(f))   
    with open(csvfile, 'ab') as f:
        # assumes that dic contains only fieldnames in csv file
        dwriter = csv.DictWriter(f, fieldnames=fieldnames) 
        dwriter.writerow(dic)

另一方面,如果新行的结构与现有行不同,则csv文件可能是错误的文件格式。为了给csv文件添加一个新的列,每一行都需要编辑。这种方法的性能非常差,对于一个大的csv文件来说会非常明显。你知道吗

相关问题 更多 >