python - 将行添加到 csv 文件而不创建中间副本

标签 python

如何通过就地编辑将行添加到 csv 文件?我想避免写入临时文件然后替换原始文件的模式(伪代码):

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

最佳答案

这在一般情况下是不可能的。这是原因,来自您的代码:

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

对我来说,这表示至少在某些情况下您的新行包含不在前几行中的列。当您像这样添加一行时,除了在末尾追加新行之外,您还必须更新文件的标题(第一行)。如果您需要按字母顺序排列列名,那么您可能必须重新排列所有其他行中的字段以保留列的顺序。

因为您可能需要编辑文件的第一行,除了在末尾附加新行并可能编辑中间的所有行之外,没有合理的方法可以就地完成这项工作。

我的建议是尝试提前弄清楚您可能需要包含的所有字段/列,这样您就可以保证您的程序永远不必编辑标题并且可以简单地添加新行。

关于python - 将行添加到 csv 文件而不创建中间副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25792747/

相关文章:

python - 为什么调用 Python 的 'magic method' 不像对应的运算符那样进行类型转换?

python - 如何处理端口的突发连接?

python - 使用不同数据类型的 numpy 数组进行多重处理时出现意外行为

python - 分别处理特定(针对io)的异常

python - 在python中识别具有不同列名的重复列值的列

python - 覆盖 Python 析构函数 (__del__) 会导致内存泄漏吗?

python - 切片 3d numpy 数组返回奇怪的形状

python - 如何在 Pandas 数据框中获得组合的组合?

Python计数/字典计数

python - 在 Pycharm 2016.3 中安装 pip