Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将带有特殊字符的csv写入数据库表_Python - Fatal编程技术网

Python 将带有特殊字符的csv写入数据库表

Python 将带有特殊字符的csv写入数据库表,python,Python,我有一个具有特殊字符的csv文件,如下所示- location_id location_name 7099395 SUPER CAFÉ 我首先将文件读入一个dataframe,然后使用sqlalchemy将dataframe写入一个数据库表 由于特殊字符,我遇到以下错误: 'ascii' codec can't encode characters in position 33-39: ordinal not in range(128) 为了解

我有一个具有特殊字符的csv文件,如下所示-

location_id          location_name
7099395                SUPER CAFÉ
我首先将文件读入一个
dataframe
,然后使用
sqlalchemy
dataframe
写入一个数据库表

由于特殊字符,我遇到以下错误:

'ascii' codec can't encode characters in position 33-39: ordinal not in range(128)
为了解决这个问题,我在函数中使用了
unidecode
模块,但它将
df
转换为
字符串。随后使用
StringIO
模块将
字符串
转换回
df
,会扭曲表格形式。如果需要,我很乐意将我的代码粘贴到这里以供参考

编辑:下面是我的代码-

from unidecode import unidecode
import pandas as pd
from pandas.compat import StringIO
from sqlalchemy import create_engine

def unicodize(item):
    def _get_int_if_int(x):
        try:
            if not abs(int(x) - float(x)) > 0:
                return int(x)
            else:
                return x
        except (ValueError, TypeError):
            return x

    try:
        if item.__contains__("_"):
            _item = item
        elif item.startswith("0") and len(item) > 1:
            _item = item
        else:
            _item = _get_int_if_int(item)
    except AttributeError:
        _item = _get_int_if_int(item)

    try:
        try:
            return unidecode(unicode(_item))
        except NameError:
            return unidecode(str(_item))
        except UnicodeDecodeError:
            try:
                return unidecode(_item.decode('utf-8'))
            except UnicodeDecodeError:
                return unidecode(_item.decode('latin-1'))
    except AttributeError:
        return _item

input = pd.read_csv('my_file.csv')
output = (unicodize(input))

df = pd.read_csv(StringIO(output), sep='\t')

output_df_dict = {}
output_df_dict['my_file'] = df
engine = create_engine('postgres://XX:YY@ZZ:5432/AA')
schema = "scenario_3"
for table_name, df in output_df_dict.items():
     df['jqgrid_id'] = df.index
     df.to_sql(table_name, con=engine, schema=schema, index=False, if_exists='replace')
     print("Data Transfer done!")

我确实在数据库表中写入了输出,但是它的形式完全扭曲了,并且表中也显示了计数。(附快照)

根本原因似乎是,在某个地方或其他地方,您正在调用
decode
对已经是
unicode
对象的对象进行解码,Python 2允许这样做,但首先通过执行
s.encode(sys.getdefaultencoding())
进行处理,因此它可以解码。而且,由于
sys.getdefaultencoding()
通常是
'ascii'
,因此通常会失败。但是很难猜到你在哪里这么做(甚至可能是间接地这么做),所以除非这足以让你自己弄明白,否则你需要向我们展示相关的代码,而不仅仅是描述它。只是在问题中添加了我的代码!您在哪一行收到异常?是不是
返回unidecode(_item.decode('latin-1'))
?另外,你能给我们看一下那一行的原始字节吗?它是
'SUPER-CAF\xc3\x83\xe2\x80\xb0'
(意思是您已经将某个东西装入UTF-8并需要修复),还是其他东西?最后,如果您在所有
unidecode
code之前打印type(_项),repr(_项)
,它会说什么?我会将输出写入数据库表中,但是它的形式完全扭曲,并且表中也显示计数。我会在几分钟内回答你的问题。当你说“有一个csv文件”时,除非你有基本解释所需的所有元数据,否则你就没有真正的csv文件,最基本的元数据是(像任何文本文件一样)它所用的字符编码。在你拥有这个之前,你所拥有的只是一个字节文件。