如何用Pandas读取无合适分隔符的CSV:拆分首列与剩余内容
解决方法:将整数+任意字符串的CSV导入Pandas生成两列DataFrame
这个场景我太熟悉了——字符串里混着各种特殊字符,常规的分隔符完全没法用,稍不注意就把字符串拆得七零八落。给你几个实用的解决方案,按需选择:
方法1:用正则表达式作为分隔符(简单快捷)
Pandas的read_csv支持正则分隔符,我们可以利用第一列是整数这个特点,匹配第一个整数后面的空白区域,只分割一次:
import pandas as pd # 正则表达式含义:匹配紧跟在开头数字后面的一个或多个空格 df = pd.read_csv( inputfile, sep=r'(?<=^\d+)\s+', # 核心:只在第一个数字块后分割 header=None, engine='python', # C引擎不支持复杂正则,必须指定python引擎 encoding='utf-8' # 根据你的文件编码调整,比如韩文可能用cp949 ) df.columns = ['number', 'text']
这个方法的优点是代码简洁,不需要手动处理每行,但如果你的文件特别大(比如几十GB),python引擎的速度可能会慢一点。
方法2:逐行读取分割(内存友好,适合超大文件)
如果文件规模很大,逐行处理能有效控制内存占用,而且完全自定义分割逻辑,不会被任何特殊字符干扰:
import pandas as pd rows = [] with open(inputfile, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: # 跳过空行 continue # 找到第一个空格的位置,把整数和后面的内容分开 first_space_idx = line.find(' ') if first_space_idx != -1: # 提取整数部分,转成int类型 num = int(line[:first_space_idx]) # 提取剩余所有内容,保留原始格式 text_content = line[first_space_idx+1:] else: # 处理极端情况:整行只有整数没有文本 num = int(line) text_content = '' rows.append([num, text_content]) # 转成DataFrame df = pd.DataFrame(rows, columns=['number', 'text'])
这个方法的灵活性最高,不管字符串里有什么字符(包括换行符以外的所有内容)都能完美保留,而且内存占用比直接用read_csv低很多。
方法3:固定宽度读取(仅当整数位数固定时可用)
如果你的整数列是固定位数的(比如所有整数都是4位),可以用read_fwf(固定宽度格式读取),这个方法速度最快:
import pandas as pd # widths参数:第一列占4个字符,第二列占剩余所有宽度 df = pd.read_fwf( inputfile, widths=[4, None], header=None, encoding='utf-8' ) df.columns = ['number', 'text']
不过这个方法局限性大,只有整数位数完全固定时才适用,否则会把部分文本拆进第一列。
注意事项
- 一定要指定正确的文件编码,比如你的例子里有韩文“눈”,如果用默认编码可能会出现乱码,推荐优先尝试
utf-8,不行再试试cp949(韩文系统常用编码)。 - 如果文件里有空白行,记得在处理时跳过,避免报错。
内容的提问来源于stack exchange,提问作者pcsso
相关产品推荐
相关产品推荐

