2017-02-28 129 views
2

我有一个数据框我希望在Python 2.7中将几行写入文件和记录器。 print(dataframe.iloc[0:4])输出数据框中列标题和前4行的好网格。然而logging.info(dataframe.iloc[0:4])抛出:熊猫的写入或日志打印输出Dataframe

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 87: ordinal not in range(128)

这里是劝慰输出,工作直接向控制台或print()(注意²):

In[89]: d.iloc[0:4] OR print(d.iloc[0:4]) 
Out[89]: 
    ISO ID_0  NAME_0 ID_1       NAME_1 ID_2 NAME_2 Area(km.²) Pop2001_Cen Pop2010_Cen HHold2010 Hhold_Size 
0 ARG 12 Argentina  2 Ciudad Autónoma de Buenos Aires  NaN  NaN  203.0 2776138.0  2890151 1150134.0 2.512882 
1 ARG 12 Argentina  2 Ciudad Autónoma de Buenos Aires 2001.0 Comuna 1   NaN  171975.0  205886 84468.0 2.437444 
2 ARG 12 Argentina  2 Ciudad Autónoma de Buenos Aires 2002.0 Comuna 2   NaN  165494.0  157932 73156.0 2.158839 
3 ARG 12 Argentina  2 Ciudad Autónoma de Buenos Aires 2003.0 Comuna 3   NaN  184015.0  187537 80489.0 2.329971 

一样file.write(dataframe.iloc[0:4])等为一体的一个列标题包含非ASCII字符。我尝试过各种各样的decode()encode()等,但无法避免这个错误。

print(d.iloc[0:4])工作,所以另一种方法是使用print(d.iloc[0:4], file=f),但即使与from __future__ import print_function我得到上面的ascii编码错误。

复制这一问题的其他方法是logging.info('Area(km.²)')'Area(km.²)'.decode()

我怎样才能使这个数据帧?

[编辑:]

我也想从根本上了解我是如何处理字符串编码/ Python中2.7解码 - 我已经远离黑客在本作更多的时间比它值得,因为这不是只有我有这个UnicodeDecodeError错误,我不知道什么时候会发生,我仍然只是抛出修复控制台,看看有什么坚持,没有任何根本的理解发生了什么。

+1

你可以张贴你的原始数据帧的提取物? –

回答

2

IIUC,你可以尝试通过encoding='utf-8'与写出数据框的第n行的时候:

df.head(n).to_csv('yourfileout.csv', encoding='utf-8') 
+0

这是行得通的,但有没有办法在内存中这样做,以便我可以将它传递给记录器并写入包含其他文本的文件?此外,我希望保留“df .__ str__”输出的列对齐。 – Chris

+0

如果文件名被忽略,'to_csv()'命令输出到控制台。我仍然喜欢格式化和解决编码问题(问题更新 - 对不起法比奥),只是在这里注意这一点,以防其他人有用。 – Chris

+0

其实我不能重现你的'logging.info'问题......也许[this](http://stackoverflow.com/questions/32686804/encoding-decoding-non-ascii-character-when-using-python-pandas)问题可能会有助于调查python的解码问题。 –