在CSV文件中解码UTF8文字

时间:2018-06-24 16:44:02

标签: python python-3.x pandas

问题:

有人知道我怎么能把这个b"it\\xe2\\x80\\x99s time to eat"变成这个it's time to eat


更多详细信息和我的代码:

大家好,

我目前正在使用一个CSV文件,其中包含满是UTF8文字的行,例如:

  

b“吃饭的时间到了\ xe2 \ x80 \ x99”

最终目标是得到这样的东西:

  

是时候吃饭了

为此,我尝试使用以下代码:

import pandas as pd


file_open = pd.read_csv("/Users/Downloads/tweets.csv")

file_open["text"]=file_open["text"].str.replace("b\'", "")

file_open["text"]=file_open["text"].str.encode('ascii').astype(str)

file_open["text"]=file_open["text"].str.replace("b\"", "")[:-1]

print(file_open["text"])

运行代码后,以我作为示例的行打印为:

  

吃饭的时间到了xe2 \ x80 \ x99

我尝试解决此问题 使用以下代码打开CSV文件:

file_open = pd.read_csv("/Users/Downloads/tweets.csv", encoding = "utf-8")

通过以下方式打印出示例行:

  

吃饭的时间到了xe2 \ x80 \ x99

并且我也尝试使用以下方法对行进行解码:

file_open["text"]=file_open["text"].str.decode('utf-8')

哪个给了我以下错误:

AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

b"it\\xe2\\x80\\x99s time to eat"听起来像您的文件包含转义的编码。

通常,您可以将其转换为适当的Python3字符串,例如:

x = b"it\\xe2\\x80\\x99s time to eat"
x = x.decode('unicode-escape').encode('latin1').decode('utf8')
print(x)     # it’s time to eat

(使用.encode('latin1') explained here

因此,如果在使用pd.read_csv(..., encoding="utf8")之后仍然对字符串进行了转义,则可以执行以下操作:

pd.read_csv(..., encoding="unicode-escape")
# ...
# Now, your values will be strings but improperly decoded:
#    itâs time to eat
#
# So we encode to bytes then decode properly:
val = val.encode('latin1').decode('utf8')
print(val)   # it’s time to eat

但是我认为最好对整个文件而不是对每个值单独执行,例如使用StringIO(如果文件不太大):

from io import StringIO

# Read the csv file into a StringIO object
sio = StringIO()
with open('yourfile.csv', 'r', encoding='unicode-escape') as f:
    for line in f:
        line = line.encode('latin1').decode('utf8')
        sio.write(line)
sio.seek(0)    # Reset file pointer to the beginning

# Call read_csv, passing the StringIO object
df = pd.read_csv(sio, encoding="utf8")