【问题标题】:Reading russian language data from csv从 csv 读取俄语数据
【发布时间】:2015-11-30 10:31:51
【问题描述】:

我在 CSV 文件中有一些俄语数据:

2-комнатная квартира РДТ',  мкр Тастак-3,  Аносова — Толе би;Алматы
2-комнатная квартира БГР',  мкр Таугуль,  Дулати (Навои) — Токтабаева;Алматы
2-комнатная квартира ЦФМ',  мкр Тастак-2,  Тлендиева — Райымбека;Алматы

分隔符是; 符号。


我想读取数据并将其放入数组中。我尝试使用此代码读取此数据:

def loadCsv(filename):
    lines = csv.reader(open(filename, "rb"),delimiter=";" )
    dataset = list(lines)
    for i in range(len(dataset)):
        dataset[i] = [str(x) for x in dataset[i]]
    return dataset

然后我读取并打印结果:

mydata = loadCsv('krish(csv3).csv')
print mydata

输出:

[['2-\xea\xee\xec\xed\xe0\xf2\xed\xe0\xff \xea\xe2\xe0\xf0\xf2\xe8\xf0\xe0,  \xec\xea\xf0 \xd2\xe0\xf1\xf2\xe0\xea-3,  \xc0\xed\xee\xf1\xee\xe2\xe0 \x97 \xd2\xee\xeb\xe5 \xe1\xe8', '\xc0\xeb\xec\xe0\xf2\xfb'], ['2-\xea\xee\xec\xed\xe0\xf2\xed\xe0\xff \xea\xe2\xe0\xf0\xf2\xe8\xf0\xe0,  \xec\xea\xf0 \xd2\xe0\xf3\xe3\xf3\xeb\xfc,  \xc4\xf3\xeb\xe0\xf2\xe8 (\xcd\xe0\xe2\xee\xe8) \x97 \xd2\xee\xea\xf2\xe0\xe1\xe0\xe5\xe2\xe0', '\xc0\xeb\xec\xe0\xf2\xfb'], ['2-\xea\xee\xec\xed\xe0\xf2\xed\xe0\xff \xea\xe2\xe0\xf0\xf2\xe8\xf0\xe0,  \xec\xea\xf0 \xd2\xe0\xf1\xf2\xe0\xea-2,  \xd2\xeb\xe5\xed\xe4\xe8\xe5\xe2\xe0 \x97 \xd0\xe0\xe9\xfb\xec\xe1\xe5\xea\xe0', '\xc0\xeb\xec\xe0\xf2\xfb']]

我发现在这种情况下需要编解码器,并尝试对这段代码做同样的事情:

import codecs
with codecs.open('krish(csv3).csv','r',encoding='utf8') as f:
    text = f.read()
print text

我收到了这个错误:

newchars, decodedbytes = self.decode(data, self.errors)

UnicodeDecodeError: 'utf8' codec can't decode byte 0xea in position 2: invalid continuation byte

有什么问题?使用编解码器时如何在我的数据中指定分隔符? 我只想从文件中读取数据并将其放入二维数组中。

【问题讨论】:

  • return ([f.decode('cp1251') if isinstance(s, bytes) else f for f in row] for row in csv.reader(open(filename, "rb"),delimiter=";"))

标签: python csv unicode python-2.x python-unicode


【解决方案1】:

\eaк 的 windows-1251 / cp5347 编码。因此,您需要使用windows-1251 解码,而不是UTF-8。

在 Python 2.7 中,CSV 库不能正确支持 Unicode - 请参阅 https://docs.python.org/2/library/csv.html 中的“Unicode”

他们提出了一个简单的解决方法:

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
        f = UTF8Recoder(f, encoding)
        self.reader = csv.reader(f, dialect=dialect, **kwds)

    def next(self):
        row = self.reader.next()
        return [unicode(s, "utf-8") for s in row]

    def __iter__(self):
        return self

这将允许您这样做:

def loadCsv(filename):
    lines = UnicodeReader(open(filename, "rb"), delimiter=";", encoding="windows-1251" )
    # if you really need lists then uncomment the next line
    # this will let you do call exact lines by doing `line_12 = lines[12]`
    # return list(lines)

    # this will return an "iterator", so that the file is read on each call
    # use this if you'll do a `for x in x`
    return lines 

如果您尝试打印dataset,那么您将在列表中获得列表的表示形式,其中第一个列表是行,第二个列表是列。任何编码的字节或文字都将用\x\u 表示。要打印这些值,请执行以下操作:

for csv_line in loadCsv("myfile.csv"):
    print u", ".join(csv_line)

如果您需要将结果写入另一个文件(相当典型),您可以这样做:

with io.open("my_output.txt", "w", encoding="utf-8") as my_ouput:
    for csv_line in loadCsv("myfile.csv"):
        my_output.write(u", ".join(csv_line))

这会自动将您的输出转换/编码为 UTF-8。

【讨论】:

  • 抱歉,查看最新编辑。你的代码应该使用UnicodeReader()
  • 我在我的代码中包含了 UnicodeReader 和 UTF8Recoder 并尝试使用 loadCsv()。但是数据集变量中的数据如下所示:u"2-\u043a\u043e\u043c\u043d\u0430\u0442。我做错了什么吗?
  • 不,没关系。这是因为您正在打印整行,即list,所以您得到了一个“表示”。您看到的是 Unicode 文字,这意味着您的数据已被正确解码。这是一件好事! :) 尝试使用print line[0],它将 Unicode 值编码为控制台的区域设置
  • 我添加了一些代码来展示如何迭代和加入你的结果
  • 啊,是的。我明白为什么会发生这种情况。我已经更新了 loadCsv 方法来返回一些东西。
【解决方案2】:

你不能试试:

import pandas as pd 
pd.read_csv(path_file , "cp1251")

import csv
with open(path_file,  encoding="cp1251", errors='ignore') as source_file:
        reader = csv.reader(source_file, delimiter=",") 

【讨论】:

    【解决方案3】:

    您的 .csv 可以是另一种编码,而不是 UTF-8 吗? (考虑到错误消息,它甚至 应该 是)。尝试其他西里尔文编码,例如 Windows-1251 或 CP866 或 KOI8。

    【讨论】:

      【解决方案4】:

      在py3中:

      import csv
      
      path = 'C:/Users/me/Downloads/sv.csv'
      
      with open(path, encoding="UTF8") as f:
          reader = csv.reader(f)
          for row in reader:
              print(row)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-10
        • 2021-03-26
        • 1970-01-01
        • 2015-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        相关资源
        最近更新 更多