我一直在寻找一个解决方案,并且找不到一个。我有一个文件夹目录,其中包含多个非常大的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有可能太大吗?
我还没有能够确定一种不同的方式来做到这一点或使这种方式有效。任何帮助将不胜感激!
答案 0 :(得分:0)
在Linux上,您可以打开一个文件进行阅读&同时写作。系统确保没有冲突,但在幕后,正在处理2个不同的文件对象。这种方法非常不安全:如果程序在读/写时崩溃(断电,磁盘已满)......文件很有可能被截断/损坏。
无论如何,在Windows中,您无法使用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
操作是即时的。此外,如果程序/计算机在任何时候崩溃,其中一个文件(旧的或新的)是有效的,所以它是安全的。
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
字符替换第一行,倒回文件并写回第一行,覆盖以前的内容,保留其余行。这也是安全的,即使文件很大,也非常快。唯一的限制是模式必须具有完全相同的大小(否则您将拥有先前数据的剩余部分,或者您将覆盖下一行,因为没有数据被移位)