Python CSV模块同时读写
我有两个.csv文件,我正在其中一个(文件a)中查找数据,并将其与另一个(文件b)进行匹配。一旦我在b中找到了要写入相应行中特定单元格的相应行。此外,我还需要对其进行迭代,以便可能会多次写入文件b中的每一行 我可以写入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]):
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”的情况下,您应该继续迭代整个过程,在进行任何查找之前,一次将所有内容加载到内存中。然后,在你完成计算之前不要写任何东西,并在那一点上把它全部写出来。