【问题标题】:Best way to convert unicode in csv to plain text?将csv中的unicode转换为纯文本的最佳方法?
【发布时间】:2014-06-17 05:52:40
【问题描述】:

我有一个包含 unicode 字符的大型 csv 文件,这些字符会导致我尝试运行的 Python 脚本出错。到目前为止,我删除它们的过程非常乏味。我运行我的脚本,一旦它遇到一个 unicode 字符,我就会收到一个错误:

'ascii' codec can't encode character u'\xef' in position 197: ordinal not in range(128)

然后我用谷歌搜索 u'\xef' 并试图找出这个字符实际上是什么(有谁知道有这些定义列表的网站吗?)。我正在使用这些信息来构建字典,并且我有第二个 Python 脚本,可以将 unicode 字符转换为常规文本:

unicode_dict = {"\xb0":"deg", "\xa0":" ", "\xbd":"1/2", "\xbc":"1/4", "\xb2":"^2", "\xbe":"3/4"}

for f in glob.glob(r"C:\Folder1\*.csv"):
    in_csv = f
    out_csv = f.replace(".csv", "_2.csv")

    write_f=open(out_csv, "wb")
    writer = csv.writer(write_f)

    with open(in_csv,'rb') as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            new_row = []
            for s in row:
                for k, v in unicode_dict.iteritems():
                    s = s.replace(k, v)
                new_row.append(s)
            writer.writerow(new_row)

    write_f.close()
    os.remove(in_csv)
    os.rename(out_csv, in_csv)

然后我必须再次运行代码,出现另一个错误,然后在 Google 上查找下一个 unicode 字符。一定有更好的办法吧?

【问题讨论】:

  • 如果这是 Python 2 而不是 Python 3,那么您的字符可能不是 Unicode,而是 Windows-1252ISO 8859-1
  • @Mark:这就是 OP 对它们的解释方式。由于我们没有看到他是如何决定原始文本中的“\xbd=1/2”的,因此它可能完全是其他东西——即西里尔文、希腊文、希伯来文或任何其他可能的 8 位代码页。
  • @Jongware,我只能假设这些字符在数据上下文中是有意义的,否则这将是一个完全不同的问题。

标签: python csv dictionary unicode


【解决方案1】:

阅读http://www.joelonsoftware.com/articles/Unicode.html。小心点。

然后,您就会明白,您需要知道您的文件的哪种编码。如果您能够找出\xbd 的含义,也许某个地方提到了哪种编码是的。

然后,使用 io.open(in_csv, 'rb', encoding='yourencodinghere') 代替原版的 open 调用。

那么,显然 csv 模块不处理 Unicode,唉。使用 SBillion 的答案(例如 http://www.joelonsoftware.com/articles/Unicode.html )来解决它。

【讨论】:

  • 当我阅读问题时,问题不在于确定源数据的编码方式,问题在于基于该数据创建纯 ASCII 文件。
  • 我读它的方式(见第一句话)是他的问题是特殊字符导致他的脚本失败,他试图手动删除它们来解决这个问题。应该有更好的方法。
  • 请注意,文档解释了如何使用标准库在 csv 文件中通过 utf-8 执行 Unicode:13.1. csv — CSV File Reading and Writing — Python v2.7.7 documentation
【解决方案2】:

你应该看看这个,通过标准 python 库在 csv 文件中通过 utf-8 处理 Unicode: https://docs.python.org/2/library/csv.html#csv-examples

但如果您愿意,您可以使用这个外部 unicode 兼容模块:https://pypi.python.org/pypi/unicodecsv/0.9.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 2011-01-24
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多