使用Unicode将CSV转换为YAML?

时间:2014-11-12 13:52:14

标签: python csv python-3.x unicode yaml

我正在尝试使用Python 3.4将包含Unicode字符串的CSV文件转换为YAML文件。

目前,YAML解析器将我的Unicode文本转义为ASCII字符串。我希望YAML解析器将Unicode字符串导出为 Unicode字符串,而不使用转义字符。当然,我在这里误解了一些东西,我很感激你的帮助。

奖励积分:如何使用Python 2.7完成这项工作?

CSV输入

id, title_english, title_russian
1, A Title in English, Название на русском
2, Another Title, Другой Название

当前的YAML输出

- id: 1
  title_english: A Title in English
  title_russian: "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043D\u0430\
    \ \u0440\u0443\u0441\u0441\u043A\u043E\u043C"
- id: 2
  title_english: Another Title
  title_russian: "\u0414\u0440\u0443\u0433\u043E\u0439 \u041D\u0430\u0437\u0432\u0430\
      \u043D\u0438\u0435"

所需的YAML输出

- id: 1
  title_english: A Title in English
  title_russian: Название на русском
- id: 2
  title_english: Another Title
  title_russian: Другой Название

Python转换代码

import csv
import yaml
in_file  = open('csv_file.csv', "r")
out_file = open('yaml_file.yaml', "w")
items = []

def convert_to_yaml(line, counter):
    item = {
        'id': counter,
        'title_english': line[0],
        'title_russian': line[1]
    }
    items.append(item)

try:
    reader = csv.reader(in_file)
    next(reader) # skip headers
    for counter, line in enumerate(reader):
        convert_to_yaml(line, counter)
    out_file.write( yaml.dump(items, default_flow_style=False) )

finally:
    in_file.close()
    out_file.close()

谢谢!

2 个答案:

答案 0 :(得分:5)

我遇到了同样的问题,这就是我能够根据你上面的例子解决它的方法

out_file.write(yaml.dump(items, default_flow_style=False,allow_unicode=True) )

包括allow_unicode=True解决了这个问题。

也特别针对python2使用safe_dump而不是dump来阻止!!python/unicode与unicode文本一起显示。

out_file.write(yaml.safe_dump(items, default_row_style=False,allow_unicode=True)

答案 1 :(得分:1)

在Python 2.x中,您应该使用Unicode CSV阅读器,因为Python的CSV阅读器不支持它。您可以使用unicodecsv来实现此目的。

在您当前的Python 3.x代码中,您应该在打开它时显式传递文件编码:

import csv
with open('some.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

可能您的系统已经做了正确的事情,但在这种情况下您依赖于默认设置。

最后,您需要确保使用正确的编码打开YAML文件:open("yaml_file.yaml", "w", encoding="utf-8")。此编码应在以后读取YAML文件时使用。

我不确定yaml库在给定Python对象时的作用,但是当你在line[0]中设置line[1]convert_to_yaml时,你需要检查它们是否为Unicode字符串{ {1}}。