我有以下条目的CSV
“ column1” | “ column2” | “ column3” | “ column4” | “ column5”
“ 123” | “ sometext”,“ this somedata”,“ 8 inch”“,” hello“
当我尝试读取8 inches"
时出现问题,我无法使用read_csv()
读取csv。
Pandas.read_csv(io.BytesIO(obj['Body'].read()), sep="|",
quoting=1,
engine='c', error_bad_lines=False, warn_bad_lines=True,
encoding="utf-8", converters=pandas_config['converters'],skipinitialspace=True,escapechar='\"')
有没有一种方法可以处理单元格中的报价。
答案 0 :(得分:2)
从为这种情况传递适当的参数开始:
仅上述选项就可以调用 read_csv ,没有错误,但缺点是 (目前)是保留双引号。
要消除它们,至少从数据行中消除,还需要另一个技巧:
定义转换器(lambda)函数:
cnv = lambda txt: txt.replace('"', '')
并将其应用于所有源列。
在您的情况下,您有5列,因此为了使代码简洁明了, 您可以使用词典理解:
{ i: cnv for i in range(5) }
因此整个代码可以是:
df = pd.read_csv(io.StringIO(txt), sep='[|,]', skipinitialspace=True,
engine='python', converters={ i: cnv for i in range(5) })
结果是:
"column1" "column2" "column3" "column4" "column5"
0 123 sometext this somedata 8 inches hello
但是请记住,现在所有列都是 string 类型,因此您应该 将所需的列转换为数字。 一种替代方法是为数字列传递第二个转换器, 返回数字,而不是字符串。
要使用正确的列名(不带双引号),可以传递其他参数:
答案 1 :(得分:0)
我们可以指定一个稍微复杂的分隔符,读取数据并去除多余的引号字符:
# Test data:
text='''"column1"| "column2"| "column3"| "column4"| "column5"
"123" | "sometext", "this somedata", "8 inches"", "hello"'''
ff=io.StringIO(text)
df= pd.read_csv(ff,sep=r'"\s*[|,]\s*"',engine="python")
# Make it tidy:
df= df.transform(lambda s: s.str.strip('"'))
df.columns= ["column1"]+list(df.columns[1:-1])+["column5"]
结果:
column1 column2 column3 column4 column5
0 123 sometext this somedata 8 inches hello