Python 替换列'的内容;x';来自列为';x';在一个非常大的文件B中
我有两个文件。“A”不是太大(2GB),而“B”在60GB时相当大。我有一个基本代码,如下所示:Python 替换列'的内容;x';来自列为';x';在一个非常大的文件B中,python,csv,Python,Csv,我有两个文件。“A”不是太大(2GB),而“B”在60GB时相当大。我有一个基本代码,如下所示: import csv #imports module csv filea = "A.csv" fileb = "B.csv" output = "Python_modified.csv" source1 = csv.reader(open(filea,"r"),delimiter='\t') source2 = csv.reader(open(fileb,"r"),delimiter='\t')
import csv #imports module csv
filea = "A.csv"
fileb = "B.csv"
output = "Python_modified.csv"
source1 = csv.reader(open(filea,"r"),delimiter='\t')
source2 = csv.reader(open(fileb,"r"),delimiter='\t')
#open csv readers
source2_dict = {}
# prepare changes from file B
for row in source2:
source2_dict[row[2]] = row[2]
# write new changed rows
with open(output, "w") as fout:
csvwriter = csv.writer(fout, delimiter='\t')
for row in source1:
# needs to check whether there are any changes prepared
if row[3] in source2_dict:
# change the item
row[3] = source2_dict[row[3]]
csvwriter.writerow(row)
它应该通读两个文件中的第3列,如果有匹配项,则将文件A中的第4列替换为文件B中第4列的内容。但是,由于它读取的是大文件,因此速度非常慢。有什么方法可以优化它吗?您可以尝试将大块的
文件读入内存,然后处理每个块。这意味着您要先进行一组读取,然后进行一组写入,这将有助于减少磁盘抖动。您需要决定使用哪个块大小
,这显然是一个适合内存的东西
from itertools import islice
import csv #imports module csv
file_a = "A.csv"
file_b = "B.csv"
output = "Python_modified.csv"
block_size = 10000
# prepare changes from file B
source2_dict = {}
with open(file_b, 'rb') as f_source2:
for row in csv.reader(f_source2, delimiter='\t'):
source2_dict[row[3]] = row[4] # just store the replacement value
# write new changed rows
with open(file_a, 'rb') as f_source1, open(output, "wb") as f_output:
csv_source1 = csv.reader(f_source1, delimiter='\t')
csv_output = csv.writer(f_output, delimiter='\t')
# read input file_a in large groups
for block in iter(lambda: list(islice(csv_source1, block_size)), []):
for row in block:
try:
row[4] = source2_dict[row[3]]
except KeyError as e:
pass
csv_output.writerow(row)
其次,为了减少内存使用,如果只是替换一个值,那么只需将该值存储在字典中
使用Python2.x进行测试。如果您使用的是Python3.x,则需要更改文件的打开位置,例如
with open(file_b, 'r', newline='') as f_source2:
您已将较小的文件加载到内存中进行查找-请确保该文件没有被交换,并且保留在RAM中(例如:它不会导致某种抖动)。。。除此之外-你必须阅读每个文件一次。。。如果较大文件的读/写速度太慢,那么“加快磁盘速度”可能是唯一真正的解决方案……两个文件中的行数是否相等?@stovfl否,文件不同。较大的一个是引用(B),它有第4列,我希望使用文件a的数据将其作为第4列包含在新文件中。