我对格式非常糟糕的csv文件有一个特殊的问题 用逗号作为分隔符,但也在一些列字段字符串和包含逗号的列表中构建。
Python中是否有一种方法可以在有或没有Pandas的情况下在数据框中加载csv 有这样的声明? :只要有(逗号),就在新列中分开,除非它在" []"之间。或""
或者替换[]和""之间逗号的方法。通过一个空间,这应该也可以。
这是一个结构示例(当然原始的行和列中有更多的行和列):
我有什么:
column1,column2,column3,column.4
375,"string1","string.2",["string3"]
320,"string4, string5","string6",500
345,"string7",["string8", "string9"],"string10"
我想要的是什么:
column1 column2 column3 column.4
1 375 "string1" "string.2" ["string3"]
2 320 "string4, string5" "string6" 500
3 345 "string7" ["string8", "string9"] "string10"
以下是我的尝试:
df = pd.read_csv("test.csv", quotechar='"')
df = pd.read_csv("test.csv", sep=(','), quotechar='"', doublequote=True)
但每次弹出相同的错误:
pandas.parser.CParserError: Error tokenizing data. C error: Expected 18 fields in line 3, saw 19
因为列表中的逗号仍在分开
非常感谢任何帮助
答案 0 :(得分:0)
使你的玩具数据集工作的整个技巧是假设如果出现撇号并且后面有空格,则不要用临时分隔符|
替换该撇号。例如,取"string4, string5"
- 如果这可能是"string4,string5"
(删除了空格),则下面的'诀窍'可能不合适。希望它有所帮助。
import pandas as pd
import re
## data in 'myfile.csv' looks like this##
##column1,column2,column3,column.4
##375,"string1","string.2",["string3"]
##320,"string4, string5","string6",500
##345,"string7",["string8", "string9"],"string10"
new_data = []
with open(r'C:\Users\Owner\Downloads\myfile.csv') as f:
f_as_string = f.read()
res = re.sub(',(?!\s)', '|', f_as_string)
for i in res.split('\n'):
new_data.append(i.split('|'))
df = pd.DataFrame(data=new_data[1:], columns=new_data[0])
## Produces this dataframe literally retaining quotes
## column1 column2 column3 column.4
##0 375 "string1" "string.2" ["string3"]
##1 320 "string4, string5" "string6" 500
##2 345 "string7" ["string8", "string9"] "string10"