如何跳过CSV文件中的无效空格分隔行而非指定跳过前N行
通用读取非标准CSV文件的Pandas方法
原始CSV文件内容
Provided by someone, unformatted by another-one for some purposes, another-one would never hand out such a mess ;) Have fun! $ Column names :azimuth:zenith:bjorkeny:energy:pos_x:pos_y:pos_z:proba_track:proba_cscd $ Data 0:2,3495370211373316:1,1160038417256017:0,04899799823760986:3,3664000034332275:52,74:28,831:401,18600000000004:0,8243512974051896:0,17564870259481039 1:5,575785663044353:1,7428377336692398:0,28047099709510803:3,890000104904175:48,369:29,865:417,282:0,8183632734530938:0,18163672654690619 2:4,656124692722159:2,686909147834136:0,1198429986834526:3,2335000038146973:71,722:121,449:363,077:0,8283433133732535:0,17165668662674652
现有读取代码
pd.read_csv( 'data/neutrinos.csv', on_bad_lines='skip', sep=':', skiprows=5, comment='$', index_col=0, decimal=',' )
通用解决方案
无需指定固定跳过行数或注释符,可通过识别有效行的特征(比如包含分隔符:)来自动过滤无效内容,以下是两种可行方法:
方法1:利用skiprows的函数判断
skiprows支持传入一个函数,根据行内容判断是否跳过。我们可以检查每行是否包含分隔符:,非空且含分隔符的行保留,其余跳过:
def should_skip(row_idx, file_path): with open(file_path, 'r') as f: for idx, line in enumerate(f): if idx == row_idx: stripped_line = line.strip() # 空行或不含分隔符则跳过 return len(stripped_line) == 0 or ':' not in stripped_line df = pd.read_csv( 'data/neutrinos.csv', sep=':', index_col=0, decimal=',', on_bad_lines='skip', skiprows=lambda x: should_skip(x, 'data/neutrinos.csv') )
方法2:预处理文件后读取
先手动过滤出有效行,再用StringIO转为Pandas可读取的对象,这种方式更适合大文件,避免重复读取:
from io import StringIO valid_content = [] with open('data/neutrinos.csv', 'r') as f: for line in f: stripped_line = line.strip() # 仅保留非空且包含分隔符的行 if stripped_line and ':' in stripped_line: valid_content.append(line) # 将过滤后的内容转为内存文件对象 filtered_data = StringIO(''.join(valid_content)) df = pd.read_csv( filtered_data, sep=':', index_col=0, decimal=',', on_bad_lines='skip' )
两种方法的核心逻辑一致:通过分隔符:识别有效数据行,自动跳过纯文本注释、空行等无效内容,无需依赖固定行数或特定注释符号,通用性更强。
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

