在Python中获取字符串和csv文件的正确编码

时间:2012-08-02 20:09:50

标签: python encoding csv

我在Python中使用mechanize从网站获取一些数据并向其发送新数据。

问题是这个网站是法语的,所以我得到一个菱形( )的问号而不是éÉÀàùÙîû等其他各种字符。

我尝试在Google和StackOverflow上四处寻找,并找到了解决我问题的各种答案。我已经看到了建议尝试以下其中一行的答案:

myString = éÀî

myString.encode('latin-1')
myString.encode('iso-8859-1')

unicode(myString, 'iso-8859-1')

但这些似乎都不起作用。

我需要这个的两种情况是当我读取带有重音的csv文件和包含重音的硬编码字符串时。例如,这是csv文件中的一行(实际上是';'是分隔符):

Adam Guérin;myemail@mail.com;555-5555;2011-02-05

'é'看起来不错,但是当我尝试使用机械化填充网站上的textField并提交时,'é'现在在实际网站上看起来像' '。

修改

这是我在csv文件中读取数据的代码:

subscriberReader = csv.reader(open(path, 'rb'), delimiter=';')
subscribers = []

for row in subscriberReader:
    subscribers.append(Subscriber(row[0], row[1], row[2]))

然后我使用mechanize将其发送到网站:

self.br.select_form('aspnetForm')

self.br.form['fldEmail'] = subscriber.email
self.br.form['fldName'] = subscriber.name
self.br.form['fldPhoneNum'] = subscriber.phoneNum

self.br.submit()

我尝试了各种方法对字符进行编码,但我想我没有正确地进行编码。我很乐意尝试在答案/评论中提出的任何建议。

对于网站,它没有指定标题中使用的编码。

1 个答案:

答案 0 :(得分:4)

首先,您提到要将文字放入代码中。为此,您需要告诉Python脚本文件的编码。您可以在文件开头使用注释声明(我假设您正在使用latin-1)。

# -*- coding: latin-1 -*-
myString = u'éÀî'

其次,您需要能够使用字符串。这不是特定于机械的,但涵盖一些基础知识应该是有用的:首先,myString最终成为一个unicode对象(因为声明文字的方式,u'')。因此,要将其用作Latin-1编码,您需要调用.encode(),例如:

with open('test.txt', 'w') as f:
    f.write(myString.encode('latin-1'))

最后,当读取编码的字符串(例如,来自远程网站)时,您可以使用.decode()将其解码为unicode对象,并从那里开始使用它。

with open('test.txt', 'r') as f:
    myString = f.read().decode('latin-1')