ChatGPT解决这个技术问题 Extra ChatGPT

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

我已经阅读了有关 Pandas 的 to_csv( ... etc ...) 的 Python 2 限制。我击中了吗?我在 Python 2.7.3

当 ≥ 和 - 出现在字符串中时,这会变成垃圾字符。除此之外,出口是完美的。

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

有什么解决方法吗?

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  

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

整个代码是这样的:

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")
给我们一个您的数据示例,因为我无法重现“垃圾”字符。
甚至不必是您的数据。重现问题的简单、完整示例是我们想要的:df = pd.DataFrame({"A": ['a', '≥']}); df.to_csv('test.csv'),对我来说很好。也发布您的python版本。
嗯,我尝试了@TomAugspurger 的简单测试,但我得到“SyntaxError: Non-ASCII character '\xe2' in file test.py on line 5, but no encoding declaration; see python.org/peps/pep-0263.html for details”不用说,我不明白他们指向我的页面。我的意思是,我知道我需要编辑我的 python 安装......但我现在在其他地方的最后期限,你知道吗?
您的 python 或终端编码设置为仅期望 ascii 字符。您可以阅读 here,了解一种设置编码的方法,该方法可以作为 临时 解决方案。
是的,我认为必须这样做。无论如何,我都害怕在项目中间更新到 Python 3。

M
Mark Tolonen

您的“坏”输出是 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')

该编码器将添加 BOM。


这个解决方案 encoding='utf-8-sig' 对我有用。 encoding='utf-16' 也应该工作
这个问题快把我逼疯了!非常感谢您的精彩回答!有趣的是,执行 df.to_excel('file.csv') 会生成一个与 Excel 没有问题的 Excel 文件。似乎此问题仅与 CSV 文件有关...
@gaborous CSV 文件是文本文件,需要 Excel 的编码 BOM 提示才能正确打开它。您是说df.to_excel('file.xls')吗?使用 df.to_excel('file.csv') 时出现错误。 XLS 和 XLSX 文件已经是 Excel 格式,因此 Excel 打开它们肯定没有问题。
@MarkTolonen 是的,对于文件扩展名,这是我的错字。事实上,对于 BOM,我学到了很多困难的方法,但这并不明显(为什么要提供在没有 BOM 的情况下将“utf-8”另存为 CSV 的选项?)。
@xjcl 对于合理的一些狭义定义。 Windows 处理编码,然后在 UTF-8 发明之前采用 Unicode,向后兼容性很重要。
g
germ

encoding='utf-8-sig 对我不起作用。 Excel 现在可以很好地读取特殊字符,但制表符分隔符不见了!但是,encoding='utf-16 可以正常工作:特殊字符 OK 和制表符分隔符有效。这是我的解决方案。


最终的教训是,您需要了解编码的基础知识才能指定正确的编码。或许请参阅包含指向更多信息的简短介绍的 Stack Overflow character-encoding tag info page
utf-16 在我的情况下不起作用。点击 AttributeError: Can only use .str accessor with string values!df[name].str.contains(regx, regex=True, na=False) 打开一次。在 Windows 上返回“utf-8-sig”。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅