Pandas df.to_csv ("file.csv" encode = "utf-8") still produces garbage characters for the minus sign

I read something about limiting Python 2 to Pandas' to_csv (... etc.). Did I hit him? I'm on Python 2.7.3

Get recycle characters for ≥ and - when they appear in lines. In addition, exports are excellent.

df.to_csv("file.csv", encoding="utf-8") 

Is there any workaround?

df.head ():

 demography Adults ≥49 yrs Adults 1849 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 

Csv output is

 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 

whole code:

 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 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") 
+7
python pandas csv utf-8
source share
1 answer

Your "bad" conclusion is UTF-8, displayed as CP1252.

On Windows, many editors assume default ANSI encoding (CP1252 on US Windows) by default instead of UTF-8 if there is no byte sign (BOM) at the beginning of the file. Try:

 df.to_csv('file.csv',encoding='utf-8-sig') 

This encoder will add a specification.

+10
source share