Pandas df.to_csv("file.csv"encode ="utf-8")仍为减号提供垃圾字符

Mag*_*gie 25 python csv utf-8 pandas

我已经阅读了关于Pandas'to_csv(......等等)的Python 2限制的内容.我打了吗?我在使用Python 2.7.3

当它们出现在字符串中时,这会产生≥和 - 的垃圾字符.除此之外,出口是完美的.

df.to_csv("file.csv", encoding="utf-8") 
Run Code Online (Sandbox Code Playgroud)

有没有解决方法?

df.head()是这样的:

demography  Adults ?49 yrs  Adults 18?49 yrs at high risk||  \
state                                                           
Alabama                 32.7                             38.6   
Alaska                  31.2                             33.2   
Arizona                 22.9                             38.8   
Arkansas                31.2                             34.0   
California              29.8                             38.8  
Run Code Online (Sandbox Code Playgroud)

csv输出就是这个

state,  Adults ≥49 yrs,   Adults 18−49 yrs at high risk||
0,  Alabama,    32.7,   38.6
1,  Alaska, 31.2,   33.2
2,  Arizona,    22.9,   38.8
3,  Arkansas,31.2,  34
4,  California,29.8, 38.8
Run Code Online (Sandbox Code Playgroud)

整个代码是这样的:

import pandas
import xlrd
import csv
import json

df = pandas.DataFrame()
dy = pandas.DataFrame()
# first merge all this xls together


workbook = xlrd.open_workbook('csv_merger/vaccoverage.xls')
worksheets = workbook.sheet_names()


for i in range(3,len(worksheets)):
    dy = pandas.io.excel.read_excel(workbook, i, engine='xlrd', index=None)
    i = i+1
    df = df.append(dy)

df.index.name = "index"

df.columns = ['demography', 'area','state', 'month', 'rate', 'moe']

#Then just grab month = 'May'

may_mask = df['month'] == "May"
may_df = (df[may_mask])

#then delete some columns we dont need

may_df = may_df.drop('area', 1)
may_df = may_df.drop('month', 1)
may_df = may_df.drop('moe', 1)


print may_df.dtypes #uh oh, it sees 'rate' as type 'object', not 'float'.  Better change that.

may_df = may_df.convert_objects('rate', convert_numeric=True)

print may_df.dtypes #that's better

res = may_df.pivot_table('rate', 'state', 'demography')
print res.head()


#and this is going to spit out an array of Objects, each Object a state containing its demographics
res.reset_index().to_json("thejson.json", orient='records')
#and a .csv for good measure
res.reset_index().to_csv("thecsv.csv", orient='records', encoding="utf-8")
Run Code Online (Sandbox Code Playgroud)

Mar*_*nen 69

您的"坏"输出为UTF-8,显示为CP1252.

在Windows上,如果文件开头没有字节顺序标记(BOM)字符,许多编辑器会采用默认的ANSI编码(美国Windows上的CP1252)而不是UTF-8.虽然BOM对UTF-8编码毫无意义,但其UTF-8编码状态可作为某些程序的签名.例如,即使在非Windows操作系统上,Microsoft Office的Excel也需要它.尝试:

df.to_csv('file.csv',encoding='utf-8-sig')
Run Code Online (Sandbox Code Playgroud)

该编码器将添加BOM.

  • 这个解决方案'encoding ='utf-8-sig'`对我有用。也应该`encoding ='utf-16' (3认同)
  • 这个问题快把我逼疯了!非常感谢您提供这么棒的答案!有趣的是,执行 `df.to_excel('file.csv')` 会生成一个与 Excel 没有问题的 excel 文件。似乎此问题仅与 CSV 文件有关... (3认同)
  • @xjcl对于合理的一些狭义定义。Windows 处理编码,然后在 UTF-8 发明之前就采用了 Unicode,向后兼容性很重要。 (3认同)
  • @gaborous CSV 文件是文本文件,需要 Excel 编码的 BOM 提示才能正确打开它。你的意思是`df.to_excel('file.xls')`吗?使用 `df.to_excel('file.csv')` 时出现错误。XLS 和 XLSX 文件已经是 Excel 格式,因此 Excel 打开它们绝对没有问题。 (2认同)