Python批量读取维度不一致的TXT文件并转为Pandas DataFrame
批量处理特殊结构TXT文件为Pandas DataFrame
针对你遇到的维度不匹配问题,这里提供两种自动化批量处理方案,对应你提到的手动补全列和跳过序号列两种需求:
方案1:补全前两行的第一列(与手动操作逻辑一致)
给前两行开头添加指定标识,统一所有行的字段数为46,保留后续行的序号列。
import pandas as pd import glob def process_single_file(file_path): # 读取所有行内容 with open(file_path, 'r') as f: lines = f.readlines() # 给前两行开头补全标识(匹配手动添加'r1'/'r2'的逻辑) lines[0] = f'r1\t{lines[0].strip()}\n' # 分隔符根据实际文件调整,如空格则用' '代替'\t' lines[1] = f'r2\t{lines[1].strip()}\n' # 将处理后的内容转为DataFrame df = pd.read_csv(pd.compat.StringIO(''.join(lines)), sep='\s+') return df # 批量遍历所有TXT文件(替换为你的文件路径) file_paths = glob.glob('./correlation_files/*.txt') # 按文件名存储处理后的DataFrame processed_dfs = {fp.split('/')[-1].split('.')[0]: process_single_file(fp) for fp in file_paths} # 可选:合并所有文件的DataFrame,保留文件来源标识 combined_df = pd.concat(processed_dfs.values(), keys=processed_dfs.keys(), names=['Source_File', 'Row_Index'])
注意:如果文件用空格而非制表符分隔,把'\t'换成' '即可;若分隔符不规则,sep='\s+'会自动匹配任意数量空白字符。
方案2:跳过后续行的第一列(简化处理)
若不需要保留后续行的序号列,直接跳过第一列,让所有行字段数统一为45。
import pandas as pd import glob def process_single_file(file_path): # 读取前两行作为列名(根据需求调整,比如作为多级列名) with open(file_path, 'r') as f: bin_names_r1 = f.readline().strip().split() bin_names_r2 = f.readline().strip().split() # 读取后续行,跳过第一列(usecols指定读取第2到第46列) df = pd.read_csv( file_path, sep='\s+', skiprows=2, usecols=range(1, 46), names=bin_names_r1 ) # 可选:将两行bin编号设为多级列名,更清晰展示维度 df.columns = pd.MultiIndex.from_tuples( list(zip(bin_names_r1, bin_names_r2)), names=['Bin_R1', 'Bin_R2'] ) return df # 批量处理逻辑同方案1 file_paths = glob.glob('./correlation_files/*.txt') processed_dfs = {fp.split('/')[-1].split('.')[0]: process_single_file(fp) for fp in file_paths} combined_df = pd.concat(processed_dfs.values(), keys=processed_dfs.keys(), names=['Source_File', 'Row_Index'])
排查提示:如果仍报维度错误,尝试添加engine='python'参数到pd.read_csv中,Python引擎对不规则分隔的兼容性更好。
内容的提问来源于stack exchange,提问作者Bipradeep Saha
相关产品推荐
相关产品推荐

