有选择地替换csv头名称

时间:2018-06-01 19:32:16

标签: python windows csv

我一直在寻找一个解决方案,并且找不到一个。我有一个文件夹目录,其中包含多个非常大的csv文件。我循环遍历目录中每个文件夹中的每个csv以替换某些标头的值。我需要标题是一致的(从文件到文件),以便运行不同的脚本来正确处理所有数据。

我找到了这个解决方案,但我会这样做:change first line of a file in python

但是这没有按预期工作。我的代码:

        from_file = open(filepath)
            # for line in f:
            #     if
        data = from_file.readline()
            # print(data)
        # with open(filepath, "w") as f:
        print 'DBG: replacing in file', filepath
            # s = s.replace(search_pattern, replacement)
        for i in range(len(search_pattern)):
            data = re.sub(search_pattern[i], replacement[i], data)
            # data = re.sub(search_pattern, replacement, data)
        to_file = open(filepath, mode="w")
        to_file.write(data)
        shutil.copyfileobj(from_file, to_file)

我想将search_pattern中的标头值替换为replacement中的值而不保存或写入其他文件 - 我想修改该文件。我也试过

        shutil.copyfileobj(from_file, to_file, -1)

据我所知,它应该复制整个文件而不是分块,但它似乎不会对我的输出产生影响。 csv有可能太大吗?

我还没有能够确定一种不同的方式来做到这一点或使这种方式有效。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您从this answer复制的change first line of a file in python来自不在Windows中工作

在Linux上,您可以打开一个文件进行阅读&同时写作。系统确保没有冲突,但在幕后,正在处理2个不同的文件对象。这种方法非常不安全:如果程序在读/写时崩溃(断电,磁盘已满)......文件很有可能被截断/损坏。

无论如何,在Windows中,您无法使用2个句柄同时打开文件进行读写。它只是破坏了文件的内容。

所以有两个选项,便携且安全:

  1. 在同一目录中创建一个文件,一旦复制,删除第一个文件,并重命名新文件
  2. 像这样:

    import os
    import shutil
    
    filepath = "test.txt"
    
    with open(filepath) as from_file, open(filepath+".new","w") as to_file:
        data = from_file.readline()
        to_file.write("something else\n")
        shutil.copyfileobj(from_file, to_file)
    os.remove(filepath)
    os.rename(filepath+".new",filepath)
    

    这不会花费更长的时间,因为rename操作是即时的。此外,如果程序/计算机在任何时候崩溃,其中一个文件(旧的或新的)是有效的,所以它是安全的。

    1. 如果模式具有相同的长度,请使用读/写模式
    2. 像这样:

      filepath = "test.txt"
      
      with open(filepath,"r+") as rw_file:
          data = rw_file.readline()
          data = "h"*(len(data)-1) + "\n"
          rw_file.seek(0)
          rw_file.write(data)
      

      在这里,我们读取该行,用相同数量的h字符替换第一行,倒回文件并写回第一行,覆盖以前的内容,保留其余行。这也是安全的,即使文件很大,也非常快。唯一的限制是模式必须具有完全相同的大小(否则您将拥有先前数据的剩余部分,或者您将覆盖下一行,因为没有数据被移位)