Python CSV模块同时读写

Python CSV模块同时读写,python,csv,Python,Csv,我有两个.csv文件,我正在其中一个(文件a)中查找数据,并将其与另一个(文件b)进行匹配。一旦我在b中找到了要写入相应行中特定单元格的相应行。此外,我还需要对其进行迭代,以便可能会多次写入文件b中的每一行 我可以写入csv文件,然后一遍又一遍地读取它吗 def match(name, group, cnum): for data in masterfile_list: if (name in data[0]): if (group in data[4]):

我有两个.csv文件,我正在其中一个(文件a)中查找数据,并将其与另一个(文件b)进行匹配。一旦我在b中找到了要写入相应行中特定单元格的相应行。此外,我还需要对其进行迭代,以便可能会多次写入文件b中的每一行

我可以写入csv文件,然后一遍又一遍地读取它吗

def match(name, group, cnum):
  for data in masterfile_list:
    if (name in data[0]):
        if (group in data[4]):
            if (cnum == "112"):
                data[7] = cnum
            elif (cnum == "111"):
                data[8] = cnum
            elif (cnum == "110"):
                data[9] = cnum
            elif (cnum == "109"):
                data[10] = cnum
            elif (cnum == "108"):
                data[11] = cnum
            elif (cnum == "107"):
                data[12] = cnum
            elif (cnum == "106"):
                data[13] = cnum
            elif (cnum == "105"):
                data[14] = cnum
            elif (cnum == "104"):
                data[15] = cnum
            elif (cnum == "103"):
                data[16] = cnum
            elif (cnum == "102"):
                data[17] = cnum
            elif (cnum == "101"):
                data[18] = cnum 

理想情况下,我会写入/替换匹配的行。

替换文件中的行通常不容易。通常,如果要进行更改,您必须重写文件(以安全的方式)


除非您确实知道行大小不会改变,否则您可以在读取行之前执行
ftell()
,然后执行
seek()
。但是,即使这样也不太安全,因为python中的
readline()
东西做了一些缓冲,即文件指针比应该的更接近末尾。

通常不容易替换文件中的行。通常,如果要进行更改,您必须重写文件(以安全的方式)


除非您确实知道行大小不会改变,否则您可以在读取行之前执行
ftell()
,然后执行
seek()
。但即使这样也不太安全,因为python中的
readline()
东西做了一些缓冲,即文件指针比它应该的更接近末尾。

如果文件b不是非常大,我建议使用
readlines()
来获得所有行的列表,然后在列表上迭代并根据需要更改行。这比查找文件中的不同位置并替换行要容易得多

此外,您可以显著减少函数体中的代码,我可能会这样做:

def match(name, group, cnum):
    lookup = dict(zip(map(str, range(112, 100, -1)), range(7, 19)))
    for data in masterfile_list:
        if name in data[0] and group in data[4] and cnum in lookup:
            data[lookup[cnum]] = cnum

如果文件b不是非常大,我建议使用
readlines()
来获得所有行的列表,然后遍历该列表并根据需要更改行。这比查找文件中的不同位置并替换行要容易得多

此外,您可以显著减少函数体中的代码,我可能会这样做:

def match(name, group, cnum):
    lookup = dict(zip(map(str, range(112, 100, -1)), range(7, 19)))
    for data in masterfile_list:
        if name in data[0] and group in data[4] and cnum in lookup:
            data[lookup[cnum]] = cnum

从您的代码片段中,我不确定您是如何打开/读取/写入有问题的文件的

如果文件不是太大,我会将相关的源文件读入内存,修改内存中需要的结构,然后将结果写入文件

伪码

file_a=open('file_a','r')
file_b_things=open('file_b','r').readlines()

new_things_file=open('new_things','w')
new_things=[]

for thing in file_a:
    if thing in file_b_things:
      new_thing=do_something_with(thing)
      new_things.append(new_thing)

for new_thing in new_things:
  new_things_file.write(new_thing)

从您的代码片段中,我不确定您是如何打开/读取/写入有问题的文件的

如果文件不是太大,我会将相关的源文件读入内存,修改内存中需要的结构,然后将结果写入文件

伪码

file_a=open('file_a','r')
file_b_things=open('file_b','r').readlines()

new_things_file=open('new_things','w')
new_things=[]

for thing in file_a:
    if thing in file_b_things:
      new_thing=do_something_with(thing)
      new_things.append(new_thing)

for new_thing in new_things:
  new_things_file.write(new_thing)

对不起,我对这件事还不熟悉。如果我使用CSV模块,我还可以使用CSV模块吗readline@jimstandard1029:通常情况下,不能将
csv
模块与
readlines()
一起使用。但首先将所有数据读入内存的建议仍然有效。您将迭代所有行(通过
csv
模块),而不是像
readlines()
那样一次读取所有行。在“文件b”的情况下,您应该继续迭代整个过程,在进行任何查找之前,一次将所有内容加载到内存中。然后在你完成计算之前不要写任何东西,在那一刻把它全部写出来。对不起,我对这一点还不熟悉。如果我使用CSV模块,我还可以使用CSV模块吗readline@jimstandard1029:通常情况下,不能将
csv
模块与
readlines()
一起使用。但首先将所有数据读入内存的建议仍然有效。您将迭代所有行(通过
csv
模块),而不是像
readlines()
那样一次读取所有行。在“文件b”的情况下,您应该继续迭代整个过程,在进行任何查找之前,一次将所有内容加载到内存中。然后,在你完成计算之前不要写任何东西,并在那一点上把它全部写出来。