Linux系统下如何消除Python 3 CSV写入器生成的空行
问题
我需要将视频帧分析生成的数据写入CSV文件:先收集每个视频的元数据到数组vid_data,再存入总列表data_list;之后还要写入Contractions和TimeIntervals两列。
我的代码如下:
def writing_to_cvs(): # open the file in 'writing' mode with open("output.csv", 'w', newline='', encoding='utf-8') as csv_file: # create a writer object writer = csv.writer(csv_file, lineterminator='\n') # write out the headers for the columns of the CSV file writer.writerow(["Video filename","Duration","FrameRate","NumFrames","Height","Width","Contractions","TimeIntervals"]) # using a two-dimensional list where # every sublist represents a row in the CSV #print("the row:", data_list) for vid_data in data_list: writer.writerow(vid_data) for contra in contractions_list: for c in contra: writer.writerow([''] * 6 + [c]) for inter in time_intervals: #print('time:', inter) writer.writerow([''] * 7 + [inter])
现在的问题是每次调用writerow时,行与行之间都会出现空行,生成的CSV有大量空行。我已经尝试设置newline=''和lineterminator='\n',但没有效果。我用的是Linux系统、Python 3.10版本,请问该如何解决这个空行问题?
解决方案
1. 避免重复设置换行相关参数
在Linux环境下,csv.writer默认的行终止符就是\n,同时设置open的newline=''和csv.writer的lineterminator='\n'会触发双重换行处理。只需保留open时的newline='',去掉lineterminator参数即可:
writer = csv.writer(csv_file)
2. 清理数据中的无效元素
检查contractions_list和time_intervals,如果其中包含空字符串、仅含空格的元素或自带换行符的内容,写入时会生成空行。可以提前过滤这类无效数据:
# 清理收缩数据,过滤空元素 cleaned_contractions = [c for contra in contractions_list for c in contra if c.strip()] # 清理时间间隔数据 cleaned_intervals = [inter for inter in time_intervals if inter.strip()]
3. 统一整理后批量写入
把所有要写入的行先整理成一个完整列表,再用writerows批量写入,减少IO操作的同时避免换行异常:
def writing_to_cvs(): # 整理所有行数据 all_rows = [] # 添加表头 all_rows.append(["Video filename","Duration","FrameRate","NumFrames","Height","Width","Contractions","TimeIntervals"]) # 添加视频元数据 all_rows.extend(data_list) # 添加过滤后的收缩数据 for contra in contractions_list: for c in contra: if c.strip(): all_rows.append([''] * 6 + [c]) # 添加过滤后的时间间隔数据 for inter in time_intervals: if inter.strip(): all_rows.append([''] * 7 + [inter]) # 写入文件 with open("output.csv", 'w', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file) writer.writerows(all_rows)
4. 强制指定行终止符(备选)
如果以上方法无效,可以手动指定lineterminator='\n',同时保留open的newline='',这种写法在Linux下也能稳定避免额外空行:
writer = csv.writer(csv_file, lineterminator='\n')
内容的提问来源于stack exchange,提问作者Inês
相关产品推荐
相关产品推荐

