如何将含带引号行的CSV正确导入Pandas DataFrame?
解决CSV导入Pandas时引号内内容被拆分的问题
你的CSV结构如下:
project, location, badness foo, N/A, 0 bar, 'path/to/file:[7,23]', 120
之前用pd.read_csv(filename, quotechar="'", sep="\s*,\s*")导入时,引号里的逗号被当成了分隔符,导致location列拆分、出现冗余列。问题出在sep="\s*,\s*"——这个正则分隔符会先把所有逗号(包括引号内的)都当作分隔符,之后才处理引号,自然识别不了引号内的完整内容。
正确的导入方式有两种:
方法一:默认逗号分隔+忽略逗号后空格
直接用逗号作为分隔符,通过skipinitialspace=True参数忽略逗号后面的空格,同时保留quotechar识别单引号包裹的内容:
import pandas as pd df = pd.read_csv(filename, quotechar="'", skipinitialspace=True)
这样Pandas会先识别单引号包裹的内容,把里面的逗号当作普通字符,再处理列之间的逗号分隔,同时自动跳过逗号后的空格,最终location列会完整保留'path/to/file:[7,23]'的内容,也不会出现冗余列。
方法二:Python引擎配合正则分隔符(可选)
如果一定要用正则分隔符,需要指定engine='python',并调整正则表达式匹配不在单引号内的逗号:
import pandas as pd df = pd.read_csv(filename, quotechar="'", sep="(?<!'),\s*(?!')", engine='python')
这里的正则(?<!'),\s*(?!')表示只匹配不在单引号前后的逗号,再忽略后面的空格。不过第一种方法更简洁高效,优先推荐。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

