pandas 中的 .read_csv() 方法不能正确读取转义字符

3
我正在尝试使用pandas创建ETL管道,并将数据CSV化,但我在一些转义字符方面遇到了问题。
例如,如果我的数据是'\"',并且定义的escapechar是'\',带有quotechar '"',当我读取文件时,我的数据变成了"\ ",缺少一个escapechar。
import sys
if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO

import pandas as pd
import csv

escape_char_defined = '\\'
quote_defined = '"'
separator = "|"

sample_data = []

for i in range(1,11):
    sample_data.append(i*escape_char_defined + quote_defined)

initial_df = pd.DataFrame(sample_data,columns=['column'])


csv_text = initial_df.to_csv(sep=separator,columns=None,header=None,index=False,doublequote=False,quoting=csv.QUOTE_ALL,quotechar=quote_defined,escapechar=escape_char_defined,encoding='utf-8')

csv_text = StringIO(csv_text)

final_df = pd.read_csv(csv_text,sep=separator,escapechar=escape_char_defined,quoting=csv.QUOTE_ALL,header=None,doublequote=False,encoding='utf-8')

if not final_df.equals(initial_df):
    raise Exception("Dataframes are not equal!")    

我认为这不是预期的行为,因为我使用相同的工具编写和读取CSV文本。

是否有人遇到过这个问题?


你尝试设置编码了吗?pd.read_csv(your_parameters, encoding='utf-8') - Carlo Zanocco
@CarloZanocco,是的,但结果是一样的。我会更新代码片段来解决这个问题。 - Jelther Gonçalves
好的,理想情况下希望有与我定义的相同的数据框架。如果我有一个像 " 这样的字段,那么从 CSV 文件中预期加载的是相同的字符串。是的,我尝试设置其他的 escapechar,但是 pandas 只允许我使用一个字符进行转义:“escapechar”必须是一个1个字符的字符串 - Jelther Gonçalves
1个回答

2

如果我正确理解您的需求,这里是修复后的代码。

import sys
if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO

import pandas as pd
import csv

escape_char_defined = "\\"
quote_defined = '"'
separator = "|"

sample_data = []

for i in range(1,11):
    sample_data.append(i*escape_char_defined + quote_defined)

initial_df = pd.DataFrame(sample_data,columns=['column'])

csv_text = initial_df.to_csv(sep=separator,columns=None,quoting=csv.QUOTE_NONE,header=None,index=False,doublequote=False,quotechar=quote_defined,escapechar=escape_char_defined)
csv_text = StringIO(csv_text)
final_df = pd.read_csv(csv_text,names=(["column"]),sep=separator,quoting=csv.QUOTE_NONE,escapechar=escape_char_defined,quotechar=quote_defined,header=None,doublequote=False)

if not final_df.equals(initial_df):
    raise Exception("Dataframes are not equal!")    

我已将pd.to_csv()pd.read_csv()中的quoting=csv.QUOTE_ALL替换为quoting=csv.QUOTE_NONE
选项csv.QUOTE_NONE会阻止编写器引用字段。 如果当前分隔符存在于输出数据中,则在其前面加上当前escapechar。 如果未设置,则在遇到任何需要转义的字符时,编写器将引发错误。
pd.read_csv()中,我还添加了列名'column'

这是一种解决方法,但我需要用引号分隔我的字段。 - Jelther Gonçalves
1
如果我找到了解决方案,我会编辑帖子。 - Carlo Zanocco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接