Python 替换列'的内容;x';来自列为';x';在一个非常大的文件B中

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')

我有两个文件。“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')
#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列包含在新文件中。