【问题标题】:Getting the correct encoding for strings and csv-files in Python在 Python 中获取字符串和 csv 文件的正确编码
【发布时间】:2012-08-02 20:09:49
【问题描述】:

我在 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

“é”看起来不错,但是当我尝试用 mechanize 填充网站上的 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()

我尝试了各种方法来对字符进行编码,但我想我做得不对。我很乐意尝试答案/ cmets 中建议的任何内容。

对于网站,它并没有在标题中指定它使用哪种编码。

【问题讨论】:

  • 你用的是哪个版本的python?
  • 尝试使用 unicode 字符串 f.e. str_ = u"éÀî"
  • @Lanaru 对于这个项目,我使用的是 2.7.2。
  • @Wyseck 我刚刚尝试过,但它不起作用。我已经尝试过 unicode(myString, 'iso-8859-1') 和其他编码类型,但我忘了把它放在我的问题中。
  • 这听起来可能很傻,但看起来不像是 python 问题。您的网站上的编码似乎有问题。您确定网站的编码正确吗?你能在你的网站上看到这些法语字符吗?

标签: python encoding csv


【解决方案1】:

首先,您提到要在代码中放置文字。为此,您需要告诉 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')

【讨论】:

  • 表明源字符编码和文件字符编码之间没有关系,您可以为每个字符使用不同的编码。你的回答不涵盖how to get a character encoding of a HTML file sent over http
  • 您可以使用'wb' 模式将字节写入文件并使用'rb' 模式读取字节。
  • @J.F.Sebastian:在我的测试中,没有 'b' 标志的读写同样有效。你知道这是为什么吗?
  • 它不能在你的测试中工作。你用'w'来阅读。在 Python 2 中,'r' 和 'rb' 之间的区别仅在于如何处理行尾,例如,在 Windows 上,'r' 模式将磁盘上的所有 '\r\n' 转换为 Python 字符串中的 '\n'。在 Python 3 'rb' 产生字节,'r' - Unicode 字符串
  • 这似乎不起作用。我开始认为我没有与我发送数据的网页相同的编码,但我不知道如何查看它使用的是什么编码
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2011-07-14
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
相关资源
最近更新 更多