我正在尝试使用熊猫创建ETL管道并以CSV格式处理数据,但是某些转义字符存在一些问题。
例如,如果我的数据为'\'',并且使用quotechar'“'定义的转义字符为'\',则当我读取文件时,我的数据变为” \“,缺少一个转义字符。
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文本。
有人有这个问题吗?
答案 0 :(得分:1)
如果我正确理解了您的需求,这里是固定代码。
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!")
我用quoting=csv.QUOTE_ALL
替换了pd.to_csv()
和pd.read_csv()
中的quoting=csv.QUOTE_NONE
。
选项csv.QUOTE_NONE
阻止编写者引用字段。
如果在输出数据中存在当前定界符,则在当前转义字符之前。
如果未设置,则遇到任何需要转义的字符时,编写器都会引发错误。
在pd.read_csv()中,我还将列名添加为'column'