如何使用csv模块将列中的空值替换为上方行的值?
我正在使用Python的CSV模块,想要把某一列中的空值填上前一行的值。虽然我可以在Excel中做到这一点,但我想把这个程序放在定时任务上运行,所以我在想怎么用Python来实现。
举个例子:
{{AAA, BBB, CCC} , {DDD, , EEE} , {FFF, GGG, HHH} , {III, , JJJ} , {KKK, all, LLL}, {MMM, NNN, OOO}}
应该变成:
{{AAA, BBB, CCC} , {DDD, BBB, EEE} , {FFF, GGG, HHH} , {III, GGG, JJJ} , {KKK, GGG, LLL}, {MMM, NNN, OOO}}
谢谢任何帮助或建议。
1 个回答
1
我觉得你可以通过把上一行的内容存储在一个变量里,然后用它的值来替换下一行中任何空白的地方。
with open(in_filename, newline="") as f_in, open(out_filename, "w", newline="") as f_out:
reader = csv.reader(f_in) # setup code
writer = csv.writer(f_out)
row = next(reader) # handle first line (with no replacements)
writer.writerow(row)
last_row = row # always save the last row of data that we've written
for row in reader: # loop over the rest of the lines
row = [x if x else y for x, y in zip(row, last_row)] # replace empty strings
writer.writerow(row)
last_row = row
这段代码的意思是,如果同一列中有连续几行是空的,它会一直用上一个有效的值来替换,而不仅仅是替换第一行的空值。如果第一行有空值,它们是不会被替换的。
我还使用了Python 3中的一个新参数来打开文件,这样可以让csv
模块兼容文件对象。如果你在用Python 2,打开文件的方式会稍微不同。在这种情况下,你需要以二进制模式打开两个文件(模式是"rb"
和"wb"
),并且去掉newline
这个参数。
如果默认设置不适合你的文件,你可能还需要在csv.reader
和csv.writer
中传入一些参数,以描述你特定的CSV格式(比如分隔符、引号样式等)。