Python 3.7下用Pandas导入双竖线分隔大文件遇空列问题求助
搞定双竖线分隔大文件的Pandas导入问题
嘿,我来帮你解决这个头疼的导入问题!你现在的核心问题就是分隔符指定错了——文件用的是||双竖线,你却写了sep='|',这就导致Pandas把每个单竖线都当成分隔符,自然多出一堆空列。下面给你几个实用方案,兼顾正确性和大文件的性能:
1. 最直接:修正分隔符
Pandas的read_csv默认用正则解析分隔符,而|是正则里的特殊字符(代表“或”),所以得用转义后的双竖线。用raw字符串写起来最方便:
import pandas as pd avm_sample = pd.read_csv(_avm_sample_file, sep=r'\|\|', low_memory=False)
- 加
low_memory=False是因为1GB的大文件很容易触发Pandas的类型推断警告,这个参数能帮你避开警告,还能让导入更稳定。 - 如果你的字段里有用引号包裹的内容(比如某个值本身就包含
||),记得先导入csv模块,再加quoting=csv.QUOTE_ALL或者指定quotechar参数,避免解析错误。
2. 针对超大文件的内存优化技巧
1GB的文件直接导入可能会吃满内存,给你两个优化方向:
分块读取处理
如果不需要一次性把全量数据放进内存,可以按块读取,逐块处理:
import pandas as pd chunk_size = 100000 # 每次读10万行,你可以根据自己的内存情况调整 for chunk in pd.read_csv(_avm_sample_file, sep=r'\|\|', chunksize=chunk_size, low_memory=False): # 这里写你对每个数据块的处理逻辑,比如筛选、计算、写入数据库之类的 process_your_data(chunk)
指定数据类型+按需导入列
提前给各列指定合适的数据类型,能大幅减少内存占用——比如把重复多的字符串列设为category类型,数值列用更小的类型(比如int32代替默认的int64);另外只导入你需要的列,也能省不少内存:
import pandas as pd # 先手动定义你需要的列和对应类型,示例如下: dtype_config = { 'user_id': 'int32', 'product_type': 'category', 'price': 'float32' } avm_sample = pd.read_csv( _avm_sample_file, sep=r'\|\|', dtype=dtype_config, low_memory=False, usecols=['user_id', 'product_type', 'price'] # 只导入这三列,其他列直接跳过 )
3. 极端场景备选:用内置csv模块预处理
如果Pandas的导入速度还是达不到你的要求,可以试试用Python内置的csv模块先读取,再转成DataFrame。不过这个方法一般不如Pandas优化过的引擎快,只建议在极端情况用:
import pandas as pd import csv with open(_avm_sample_file, 'r', encoding='utf-8') as f: # 自定义双竖线作为分隔符 reader = csv.reader(f, delimiter='||') # 把读取到的内容转成列表 data_rows = list(reader) # 第一行是表头,后面的是数据行 avm_sample = pd.DataFrame(data_rows[1:], columns=data_rows[0])
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

