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]):
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
我希望能写入/替换匹配的那一行。
3 个回答
0
一般来说,替换文件中的某一行并不简单。通常,如果你想做修改,就得重新写一遍整个文件(要确保安全)。
不过,如果你非常确定那一行的大小不会改变,那么你可以在读取这一行之前用 ftell()
来获取当前的位置,然后在读取之后用 seek()
回到那个位置。但即便如此,这种方法也不太安全,因为 Python 中的 readline()
会进行一些缓存处理,也就是说,文件指针可能会比实际应该在的位置更靠近文件的末尾。
1
我不太清楚你在代码片段中是怎么打开、读取和写入这些文件的。
为了实现你所描述的功能,如果文件不太大,我建议你先把相关的源文件读入内存中,然后在内存中修改你需要的结构,最后再把结果写入一个文件。
伪代码
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)
2
如果文件 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